如何在Linux下无需第三方工具防止Telnet连接Cisco路由器超时?
Linux下无需第三方工具防止Telnet会话超时的几种方法
遇到Telnet连接定期超时的问题,完全可以用Linux自带的工具解决,不用装Putty或者SecureCRT这类第三方软件,下面分享几个实用的原生方案:
方法一:用Bash脚本封装Telnet+定时心跳
写一个简单的脚本,自动启动Telnet会话并在后台定时发送心跳字符,步骤如下:
- 创建一个名为
telnet_keepalive.sh的脚本,内容如下:
#!/bin/bash # 替换成你的路由器IP/主机名 ROUTER_IP="192.168.1.1" # 启动Telnet会话并记录进程ID telnet $ROUTER_IP & TELNET_PID=$! # 每2分50秒发送一个空字符(比3分钟超时提前10秒,避免断开) while kill -0 $TELNET_PID 2>/dev/null; do sleep 170 # 向Telnet进程的标准输入发送空字符(ASCII 0,不会触发命令执行) echo -ne '\0' > /proc/$TELNET_PID/fd/0 done
- 给脚本添加执行权限:
chmod +x telnet_keepalive.sh
- 直接运行脚本即可启动带心跳的Telnet会话:
./telnet_keepalive.sh
这个脚本会在后台持续检查Telnet进程是否存活,只要会话还在,就定期发送空字符作为心跳,路由器收到后不会触发任何命令,只会刷新超时计时器。
方法二:用watch命令给现有Telnet会话补心跳
如果已经手动启动了Telnet会话,不想关掉重来,可以用watch命令向当前终端发送心跳:
- 打开一个新的终端窗口,先找到Telnet会话所在的终端设备(比如
/dev/pts/0),可以用who命令查看自己的终端:
who
输出里类似yourname pts/0 2024-05-20 10:00 (:0)的行,pts/0就是终端设备路径。
- 运行
watch命令,每170秒向目标终端发送空字符:
watch -n 170 "echo -ne '\0' > /dev/pts/0"
这个方法适合临时给正在运行的会话续命,关掉watch进程就会停止心跳。
方法三:用Bash协进程(Coproc)实现更优雅的心跳
Bash有个内置的协进程功能(Coproc),可以在不单独开脚本的情况下,同时运行Telnet和心跳任务:
直接在终端输入以下命令(替换成你的路由器IP):
coproc TELNET { telnet 192.168.1.1; } while true; do sleep 170; echo -ne '\0' >&${TELNET[1]}; done
协进程会把Telnet放到后台,然后循环发送心跳,整个过程都在当前终端环境里,关闭终端就会同时终止Telnet和心跳。
额外提示:SSH会话的续命方法(顺带一提)
如果之后改用SSH连接路由器,不用这么麻烦,直接修改~/.ssh/config文件添加以下配置即可:
Host * ServerAliveInterval 170 ServerAliveCountMax 3
ServerAliveInterval是每170秒发送一次心跳,ServerAliveCountMax是连续3次没收到响应才断开,完美避免超时。
内容的提问来源于stack exchange,提问作者Khaled Abuelenain
相关产品推荐
相关产品推荐

