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

如何将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工具模拟终端交互:

  1. 创建一个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
  1. 给脚本加执行权限:
chmod +x telnet_expect.exp
  1. 在bash脚本中调用并捕获结果:
response=$(./telnet_expect.exp "$TELNET_SERVER" "$TELNET_PORT" "$message")
echo "Response from server: $response"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 00:05:01