阅读telnet推迟了bash的回答

时间:2016-02-17 20:26:11

标签: bash telnet cat

我一直在尝试使用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 ..”就是答案。 所以我用Google搜索,并尝试了以下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-&GT;脚本没有回答,我必须使用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

我怎样才能得到答案?

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

sending 7

启动脚本后20秒

waiting...

启动脚本后~3分钟

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

1 个答案:

答案 0 :(得分:0)

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

#!/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并关闭连接。