如何从客户端保持 telnet 连接处于活动状态

问题描述 投票:0回答:3

我有一个设备作为 telnet 服务器,但如果 60 秒内没有收到数据包,则会断开连接,由于某种原因,此行为无法更改。 Putty 有一个功能可以定期向服务器发送空数据包以保持会话活动,这对我来说效果很好。但有时我必须从 Linux 终端远程登录到设备,而 putty 不可用。所以我想知道是否可以使用 linux telnet 客户端定期发送空数据包,或任何其他保持会话活动的方式,或其他可以执行此操作的命令行 telnet 客户端。

linux terminal telnet
3个回答
1
投票

这不是一个完美的解决方案,但可能就足够了。将 telnet 包装在检测缺少输入的 Expect 脚本中。它将转义序列 control-] 发送到 telnet 客户端以获得命令提示符

telnet>
,并发出命令
send nop
(无操作)。我认为这足以保持连接处于活动状态。如果没有,可以尝试其他命令。

#!/usr/bin/expect
spawn telnet localhost 
expect "ogin: "
send "username\r"
expect "assword:"
send "mypw\r"
expect {$ }
interact timeout 10 {
 log_user 0; send "\x1d"; expect "telnet>" { send "send nop\r" };
 expect "send nop\r\n"; log_user 1 }

显然,您需要使用所需的主机名、用户名、密码和预期的命令提示符来编辑它。请参阅

man expect
了解语法。


1
投票

使用命令行 telnet 客户端这是不可能的。您可以在全局范围内启用频繁的 TCP keepalive:TCP Keepalive HOWTO。我不知道这是否有任何副作用,但这似乎是一个可行的解决方法。

顺便说一下,putty 在 Linux 上可用。你只需要在你的机器上有一个 X 服务器就可以在远程主机上运行它(我假设你正在通过 ssh 进入进行 telnet 工作的 Linux 机器)。如果您使用的是 Windows,则适用于 Windows 的 Linux 子系统与 X 服务器可能可以解决问题。 Cygwin 也适用于此。


0
投票

libkeepalive

TL;博士

apt install libkeepalive0
LD_PRELOAD=/usr/lib/libkeepalive.so telnet gaia.local

说明

Telnet 使用称为 TCP 的协议与服务器进行通信。 TCP 允许程序请求“保持连接”。虽然 BSD 有一个很好的方法来处理这个问题,但 Linux 似乎需要一点点拼凑。如果程序本身没有启用 keepalive,则可以使用 LD_PRELOAD 将其包装在 libkeepalive

 中,以便在进入内核之前更改 TCP 套接字调用。

© www.soinside.com 2019 - 2024. All rights reserved.