我正在尝试从 Fluke DewK 1620a 温湿度计中提取温度和湿度数据,并将温度/湿度读数写入日志。我可以通过 netcat 使用简单的“nc 1.2.3.4 10001”连接到设备,运行一些基本命令并接收输出。现在我想构建一个命令行,我可以放入一个脚本来发送命令并将输出写入文件。
如果我从命令行运行以下命令
$ echo "read?" | nc -v -i 1 1.2.3.4 10001
我收到:
Connection to 1.2.3.4 10001 port [tcp/scp-config] succeeded!
76.55,44.4,72.06,48.0
-i 间隔过后,连接关闭,我的提示将覆盖温度和湿度数据。
然后我尝试了以下操作:
echo "read?" | nc -v -i 1 1.2.3.4 10001 >> test.out 2>&1
该命令执行,“test.out”文件仅包含每次执行的以下内容。
Connection to 1.2.3.4 10001 port [tcp/scp-config] succeeded!
文件中不包含温度和湿度读数。增加冗长似乎没有帮助。
我知道我可能错过了一些明显的东西,但我就是看不到它。任何帮助将不胜感激。
答案1
我没有发现任何问题,这让我怀疑你的福禄克是否真的有反应。
这两个netcat脚本表明你的语法没有问题
服务器:
# server
while true; do date; sleep 1; done | nc -l 10001
客户:
# client
echo "hello?" | nc -v -i1 localhost 10001 >> test.out 2>&1
检验出
[sri@tidevel netlink]$ cat test.out
Ncat: Version 6.45 ( http://nmap.org/ncat )
Ncat: Connected to 127.0.0.1:10001.
Wed Nov 5 13:54:06 EST 2014
Wed Nov 5 13:54:07 EST 2014
Ncat: Idle timeout expired (1000 ms).
因此,既然所有的工作都可以验证您是否确实从福禄克获得了响应。也许有另一个 netcat 或其他应用程序正在使用 Fluke 数据?
也许命令需要用 \r \n 或类似的东西来终止。我似乎记得Thermotrons 就是这样,但已经过去很长时间了。您可以使用 printf 来做到这一点:
printf "hello?\r\n" | nc -v -i1 localhost 10001 >> test.out 2>&1
答案2
我不确定我是否会将其称为“答案”本身,但我能够以完全不同的方式近似我想要做的事情。我没有使用 nc,而是使用 /dev/tcp 上的文件描述符取得了进一步的进展。
exec 3<>/dev/tcp/${host}/${port}
echo -e "read?" >&3
cat <&3 | tee -a ${log}
exec 3<&-
exec 3>&-
我仍然需要用这种方法解决一些问题,但我能够提取我需要的数据并将其放入日志文件中。如果我自己无法解决此方法的棘手问题,我稍后会尝试另一篇文章。