You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需人工干预获取完整telnet输出:管道方式丢失SSH版本信息

解决telnet管道方式无法获取SSH版本信息的问题

我懂你的困扰:当你用echo exit | telnet localhost 22这种管道方式执行命令时,只能拿到连接建立又关闭的输出,看不到SSH服务器返回的SSH-2.0-OpenSSH_7.4版本字符串,但直接运行telnet localhost 22却能正常显示这个信息。

问题根源

这是因为管道模式下,echo exit会立刻把exit命令推送给telnet进程,telnet收到命令后马上断开连接——而SSH服务器发送版本信息的速度可能稍慢,还没来得及把版本字符串传给你的终端,连接就已经被关闭了。直接运行telnet时,你不会立刻发送退出指令,所以有足够时间接收服务器的版本输出。

可行解决方案

1. 使用expect脚本(最可靠)

expect可以帮你等待特定输出出现后再发送退出命令,确保能完整捕获到SSH版本信息。创建一个简单的脚本:

#!/usr/bin/expect
spawn telnet localhost 22
expect "SSH-"
send "exit\r"
expect eof

将脚本保存为get_ssh_version.exp,赋予执行权限:

chmod +x get_ssh_version.exp

然后运行它:

./get_ssh_version.exp

脚本会等待SSH版本字符串出现后再发送exit命令,你就能看到完整的版本信息了。

2. 延迟发送exit命令

通过sleep给telnet预留足够时间接收服务器的版本信息,再发送exit:

{ sleep 1; echo exit; } | telnet localhost 22

这里的sleep 1可以根据实际网络情况调整(比如sleep 0.5),确保服务器有足够时间发送版本数据。这种方法简单直接,但依赖网络延迟,某些环境下可能不够稳定。

3. 使用netcat(nc)替代telnet

netcat在建立连接后不会自动发送任何命令,你可以结合timeout让它自动退出,同时捕获版本信息:

timeout 1 nc localhost 22

timeout 1会在1秒后终止nc进程,这样你就能拿到SSH服务器发送的版本字符串,无需手动输入exit。

验证效果

用以上任意一种方法,你都应该能看到类似这样的完整输出:

Trying ::1...
Connected to localhost.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.4
Connection closed by foreign host.

内容的提问来源于stack exchange,提问作者Manikandan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:50:32