在 bash 中读取 telnet 延迟的答案

Posted

技术标签:

【中文标题】在 bash 中读取 telnet 延迟的答案【英文标题】:Reading telnet delayed answer in bash 【发布时间】:2016-05-29 18:23:20 【问题描述】:

我一直在尝试使用 bash 脚本 nc 或 /dev/tcp/ 从 telnet 服务器读取(在 raspbian 操作系统上)答案。 但是服务器回答很慢,我必须等待大约 3 秒才能得到答案。 这是我的工作代码,是我手动输入的,我想在自动 bash 脚本中使用它:

telnet 192.168.1.225 233
Trying 192.168.1.225...
Connected to 192.168.1.225.
Escape character is '^]'.
7
Voltage: 222.2, Current: 0.0 Power: 0, Energy: 176
7
Voltage: 222.0, Current: 0.0 Power: 0, Energy: 176
q
^]
telnet> quit
Connection closed

“7”是我对服务器的命令,“Voltage..”是答案。 所以我用谷歌搜索,并尝试了以下 bash 脚本:

#!/bin/bash
exec 3<>/dev/tcp/192.168.1.225/233
echo "sending 7"
echo -en "7\n" >&3
sleep 20 #wait  enough time for answer
echo "waiting..."
#read -r RESPONSE <&3
#RESPONSE="$(cat <&3)"
#RESPONSE="$cat <&3"
RESPONSE="`cat <&3`"
echo "waiting..."
echo "Response is: $RESPONSE"

如您所见,我尝试了多种方法,但都没有奏效。 当我执行脚本时,我得到了这个:

sending 7
waiting...
^C

^C-> 脚本没有应答,我必须用 ctrl+c 杀死它

我想获取消息并解析数值。 我认为问题出在猫身上,但我不知道如何在延迟回答的情况下正确使用它。

我尝试在 shell 中执行我的脚本:

root@raspberrypi:/home/pi/gabor# exec 3<>/dev/tcp/192.168.1.225/233
root@raspberrypi:/home/pi/gabor# echo -en "7\n" >&3
root@raspberrypi:/home/pi/gabor# cat <&3
Voltage: 223.4, Current: 0.0 Power: 0, Energy: 175
^C

我怎样才能得到答案?

Update1:​​我试过 printf '7\n' >&3,没有变化。 Update2:我等了更多时间,得到了以下结果:

sending 7

启动脚本后 20 秒

waiting...

~启动脚本后 3 分钟

waiting...
Response is: Voltage: 226.4, Current: 0.0 Power: 0, Energy: 177

【问题讨论】:

你是如何执行脚本的?使用printf '7\n' &gt;&amp;3 而不是echo 得到相同的结果吗? 感谢您的建议,我试过了,但表现与其他方法完全一样。 我是这样执行脚本的:输入 shell: ./myscript.sh 尝试改用expect 我不知道如何在我的脚本中正确使用它。我尝试了这些方法:***.com/questions/4780893/… 错误消息:找不到命令。 【参考方案1】:

如果是缓冲问题,一次读取一个字符可能会解决问题。

#!/bin/bash

exec 3<>/dev/tcp/192.168.1.225/233
echo 7 >&3
IFS=''
while read -u 3 -N 1 char; do
    [[ $char == $'\n' ]] && break
    RESPONSE+=$char
done
IFS=$' \t\n'
exec 3>&-

echo $RESPONSE

上面使用 shell 的内置 read 一次消耗一个字符,如果读取换行符则跳出循环。 IFS 不能包含换行符,因为循环需要检查它。离开循环后,IFS 被重置并关闭连接。

【讨论】:

非常感谢您的回答!我执行了它,但没有用。但是,出于调试目的,我在“完成”之前插入了“echo $char”。它起作用了”。我注释掉了这个插入的行并再次工作。所以我不明白会发生什么。现在我删除了“echo $char”,只剩下“#”并且它有效。我删除了这一行,脚本没有'不工作。现在几分钟后它没有任何插入线就可以工作,所以和原来一样。我很困惑。我正在学习linux(我是电气工程师btw。),有时理解这个linux世界并不容易. 感谢您的帮助! 猜测,不确定性来自 bash 之外的东西,可能是服务程序。按照您的描述添加和/或删除 echos 和 cmets 不应导致脚本停止工作。你有服务程序的来源吗? 我再次尝试了 2 天前可以使用的代码,但现在无法使用。 我再次尝试了 2 天前可以使用的代码,但现在无法使用。我成功地再次开始工作,以相同的方式(插入回声),再次删除,并且工作......我编写了远程服务器的源代码。服务器在与 ESP2866 WiFi 模块连接的 STM32F103 MCU 上运行。我不认为问题出在服务器端,因为它适用于标准 telnet 连接。我不明白 bash 脚本的这种奇怪行为,为什么它会受到 echo-s 的影响?操作系统:Linux 树莓派 4.1.17-v7+

以上是关于在 bash 中读取 telnet 延迟的答案的主要内容,如果未能解决你的问题,请参考以下文章

用于测试多个地址和端口的 Bash 脚本 telnet

bash/expect/loop - 如何循环执行 telnet 的简单 bash 脚本

抑制 bash 中 telnet 的输出

如何从 bash 获取 telnet 命令的输出?

如何在 bash 脚本中正确使用 telnet?

通过 Bash 脚本通过 Telnet 发送命令