Mar*_*ysm 4 linux bash cat netcat stdin
我似乎搜索了许多非常相似的问题,但从未找到有用的东西。我正在尝试使用树莓派(第二代)与 Wifi OBDII 传感器进行通信。我可以使用以下命令
nc -C 192.168.0.10 35000
Run Code Online (Sandbox Code Playgroud)
192.168.0.10 是汽车传感器,35000 是端口。这并不重要,因为连接似乎没问题。无论如何,我可以打开一个 nc 实例,然后键入,例如“0145”(传感器代码),作为回报,我在 nc 会话的输出上得到该传感器的值(例如,我的引擎的 RPM) )。效果很好。我想做的是将命令从文本文件传输到 nc 会话中以进行绘图。因此,我的理想结果是将 RPM 值和相关时间的恒定流转储到文本文件中。我可以从那里工作。但是,我并不完全知道该怎么做。我已经设置了一个commands.txt,其中有数千行“0145”,我想读取该文件并将其逐行传递给nc(我可能可以通过睡眠来控制采样间隔),然后读取输出并将其存储到文本文件中。我知道这个问题与标准输入和标准输出以及管道有关,但无论出于何种原因,我一直无法完全理解它。我绝不是其中任何一个的大师。我还想编写整个过程的脚本。
现在,如果我跑
cat <(echo 0145) - | nc -C 192.168.0.10 35000
Run Code Online (Sandbox Code Playgroud)
这为我提供了我想要的终端输出,但仅适用于单个值。但是,一旦我尝试将其放入循环中,将 0145 放入脚本中的 $commands 中,并从 txt 文件中逐行获取 $commands ,它就停止工作。事实上,即使我将其保留为 0145 并且不使用变量,它也会在任何循环或 if 块内停止工作。
所以,长话短说,我想编写脚本将 txt 文件逐行发送到 nc 连接,然后我想将每个响应提取到另一个文件中。如果它是无脚本的,我可以打开该 nc 连接并每 1 秒发送 0145 并获取这些响应(仍然不知道如何将它们传递到文件),但这几乎没有效率。我觉得应该有一种更简单的方法来做到这一点。我有点菜鸟,但我想我可以在这里尝试一下。任何帮助是极大的赞赏
你为什么使用netcat
?Bash
可以使用内置别名处理 tcp 套接字。
n=0
while read -r line;do
((n++))
exec 3<>/dev/tcp/192.168.0.10/35000
echo -e "$line" >&3
cat <&3 > response.$n
exec 3<&-
exec 3>&-
done < data.txt
Run Code Online (Sandbox Code Playgroud)
可能有很多方法可以做到这一点。
与网猫
netcat的问题是,一旦检测到文件结尾,它就会关闭连接。netcat的 GNU 实现确实有几个选项(-k或-w -1)来无限期地保持侦听实例打开,但这两个选项都不起作用。起作用的是nmap的netcat版本,称为ncat。
在您的电脑上,安装nmap软件包,然后发出:
mkfifo return_pipe
ncat -k -l 12345 0<return_pipe| ncat -C 192.168.0.10 35000 1>return_pipe &
Run Code Online (Sandbox Code Playgroud)
现在,您可以通过以下方式以许多不同的方式传输您喜欢的所有内容
echo Ciao | ncat localhost 12345
cat somefile.txt | ncat localhost 12345
Run Code Online (Sandbox Code Playgroud)
只要您的侦听器配合(即,它在第一个文件结束后不会退出侦听),连接就不会断开。或者,您可以通过使用命名管道来简化这部分:从与发出第一个命令的终端不同的终端,
mkfifo mypipe
tail -f mypipe | ncat localhost 12345 &
echo Ciao > mypipe
cat somefile.txt > mypipe
Run Code Online (Sandbox Code Playgroud)
来自您设备的返回消息现在位于命名管道return_pipe中。命令
tail -f return_pipe >> responses
Run Code Online (Sandbox Code Playgroud)
将设备响应附加到名为response的文件中。
没有网络猫
Ipor Sircer已经指出了这一点(很好!,我的 +1)。但我的做法会略有不同,
exec 3>/dev/tcp/192.168.0.10/35000
exec 4</dev/tcp/192.168.0.10/35000
exec 4>>somefile.out
echo "Ciao" >&3
cat somefile.txt >&3
Run Code Online (Sandbox Code Playgroud)
如果您还想跟踪您的命令,
echo Ciao | tee -a file_with_my_commands 1>&3
cat somefile.txt | tee -a file_with_my_commands 1>&3
Run Code Online (Sandbox Code Playgroud)
并且,当您完成此通信后,
exec 3>&-
exec 4>&-
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11060 次 |
最近记录: |