阅读 bash 中的 telnet 延迟答复
Reading telnet delayed answer in bash
我一直在尝试使用 bash 脚本 nc 或 /dev/tcp/ 从 telnet 服务器读取(在 raspbian OS 上)答案。
但是服务器回答很慢,我得等~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"
如您所见,我尝试了多种方法,但其中 none 行得通。
当我执行脚本时,我得到这个:
sending 7
waiting...
^C
^C-> 脚本没有响应,我必须使用 ctrl+c
将其杀死
我想获取消息并解析数值。
我认为问题出在 cat 上,但我不知道如何正确使用它并延迟回答。
我尝试在 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
我怎样才能得到答案?
更新 1:我试过 printf '7\n' >&3,没有变化。
Update2:我等了更多时间,得到了以下结果:
sending 7
启动脚本后 20 秒
waiting...
启动脚本后~3分钟
waiting...
Response is: Voltage: 226.4, Current: 0.0 Power: 0, Energy: 177
如果是缓冲问题,一次读取一个字符可能会解决问题。
#!/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
被重置并关闭连接。
我一直在尝试使用 bash 脚本 nc 或 /dev/tcp/ 从 telnet 服务器读取(在 raspbian OS 上)答案。 但是服务器回答很慢,我得等~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"
如您所见,我尝试了多种方法,但其中 none 行得通。 当我执行脚本时,我得到这个:
sending 7
waiting...
^C
^C-> 脚本没有响应,我必须使用 ctrl+c
将其杀死我想获取消息并解析数值。 我认为问题出在 cat 上,但我不知道如何正确使用它并延迟回答。
我尝试在 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
我怎样才能得到答案?
更新 1:我试过 printf '7\n' >&3,没有变化。 Update2:我等了更多时间,得到了以下结果:
sending 7
启动脚本后 20 秒
waiting...
启动脚本后~3分钟
waiting...
Response is: Voltage: 226.4, Current: 0.0 Power: 0, Energy: 177
如果是缓冲问题,一次读取一个字符可能会解决问题。
#!/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
被重置并关闭连接。