如何将Telnet返回结果存入Bash脚本变量?
解决方案:捕获Telnet响应到变量
问题原因
telnet是为交互式终端设计的工具,当用管道传递输入时,它可能在发送数据后立刻终止连接,导致服务器返回的响应还没来得及输出到标准输出就被截断;另外telnet本身会输出一些状态提示(比如Trying 192.168.11...、Connected to 192.168.11.),这些信息混在输出里也会干扰结果。
可行方案
方案1:用netcat(nc)替代telnet(推荐)
netcat更适合脚本化场景,没有telnet的交互式依赖,能直接捕获服务器响应:
response=$(echo -e "$message" | nc "$TELNET_SERVER" "$TELNET_PORT") echo "Response from server: $response"
如果系统里没有nc,用包管理器安装即可(比如apt install netcat或yum install nc)。
方案2:保留telnet,调整命令逻辑
如果必须用telnet,需要给服务器足够时间返回响应,同时过滤掉telnet的状态提示:
# 发送数据后等待1秒,让服务器返回响应,再过滤掉无关提示 response=$( (echo -e "$message"; sleep 1) | telnet "$TELNET_SERVER" "$TELNET_PORT" 2>&1 | grep -v -E "^Trying|^Connected|^Escape character|^Connection closed") echo "Response from server: $response"
sleep 1:根据实际网络情况调整时长,确保服务器有足够时间返回数据grep -v:过滤掉telnet自身的状态行,只保留服务器的响应内容
方案3:用expect处理交互式场景
如果服务器需要特定的交互流程(比如等待提示符再发送数据),可以用expect工具模拟终端交互:
- 创建一个expect脚本(比如
telnet_expect.exp):
#!/usr/bin/expect set timeout 5 ;# 设置超时时间,单位秒 set server [lindex $argv 0] set port [lindex $argv 1] set message [lindex $argv 2] spawn telnet $server $port send "$message\r" ;# 发送消息,注意加换行符\r expect -re "(.*)" ;# 捕获所有返回内容 set response $expect_out(1,string) puts $response
- 给脚本加执行权限:
chmod +x telnet_expect.exp
- 在bash脚本中调用并捕获结果:
response=$(./telnet_expect.exp "$TELNET_SERVER" "$TELNET_PORT" "$message") echo "Response from server: $response"
内容的提问来源于stack exchange,提问作者Sougandh Km
相关产品推荐
相关产品推荐

