作为一个分离到这个堆栈溢出的问题,我想要执行相同的调整,除了一些调整。
我想连接到一个主机,一行一行地发送一个二进制文件,并且在每一行之间有几秒钟的延迟…它必须在同一个连接中。 我想发送的string大部分都是基于文本的,但是在行中有几个不可打印的字符。
这是我想发送的一个string/行的示例(每个文件有数千行):
<null>e<null><null>00326513,6598,no,8,,2z<null>
该<null>
值是hex值0x00
。
我已经从第一个条目中重新发现了我的问题,但是@ mzet在我原来的问题上回答了我的问题,因为我的问题是纯文本的,但后来我发现我的string中有一些0x00
字符,其中一开始我看不到。 我想用他的答案作为基础,因为我认为它几乎可行,但可能需要调整,所以这是他的贡献,而不是我的。
如果我有一个3行的文件:
<null>e<null><null>00370513,6598,no,8,,2z<null> <null>f<null><null>00891548,6598,yes,8,,3z<null> <null>f<null><null>00129525,6598,yes,8,,2z<null>
然后我想我可以调整@mzet的答案,用\x00
replace我的文件中的<null>
值,并在echo
命令中设置-e
:
[root@srv]# mkfifo /tmp/fifoIn; cat /tmp/fifoIn | nc localhost 2222 & [root@srv]# cat myfile | while read line; do echo -ne $line; sleep 2; done > /tmp/fifoIn
当我这样做的时候,我可以在服务器端看到x00
:
[root@srv]# nc -l 2222 x00ex00x0000370513,6598,no,8,,2zx00 x00fx0000891548,6598,yes,8,,3zx00 x00fx00x0000129525,6598,yes,8,,2zx00
是否有可能发送一个二进制(文本?)文件,如我所愿? 如果不能逐行发送文件,那么可以发送一个string几千次? 严格必要的,他们不需要是唯一的或在一个文件,因为我可以pipe理相同的string重复自己。
编辑#1
为什么我的脚本只发送一行到服务器(我希望有4行),之后它只是暂停(?)。 客户端(也就是服务器)closures它的连接,但是不会出现任何错误:
rm -f /tmp/fifofile mkfifo /tmp/fifofile cat /tmp/fifofile | nc 192.168.20.6 5000 & sleep 1 i="0" while [ $i -lt 4 ] do echo "$i" echo -ne "\x00e\x00\x00001212dsfdsfdsfsdfsdfsdfdsf\x00" | tee /tmp/fifofile sleep 1 i=$[$i+1] done
你可以通过两个步骤来实现它:
1)你需要用命名管道(fifo)作为输入来启动nc:
mkfifo /tmp/fifoIn; cat /tmp/fifoIn | nc localhost 2222 &
2)从文件input.txt中逐行发送数据,延迟时间为2秒:
cat input.txt | while read line; do echo $line; sleep 2; done > /tmp/fifoIn
我已经测试了这个“服务器”(我使用openbsd netcat语法):
nc -l localhost 2222
经过大量的尝试和拉我的头发,我终于明白,我可以使用NCat而不是Netcat作为NCat可以执行命令。
开始与NCat连接到端口5000
上的套接字服务器并执行脚本./sendlines.sh
:
ncat --exec "./sendlines.sh" 192.168.1.10 5000
./sendlines.sh
将在每行之间延迟./sendlines.sh
发送4行:
#!/bin/bash # # sendlines.sh, v1.00, initial release # i="0" while [ $i -lt 4 ] do echo -ne "\x00e\x00\x0000370513,6598,no,8,,2z\x00" sleep 2 i=$[$i+1] done
我还没有想出如何逐行发送二进制文件,但这并不是严格必要的,因为我可以通过多次发送相同的字符串来进行管理。
如果你知道一种方式发送一个二进制文件,一行一行,这将是非常好的,因为这将是对我来说最好的解决方案。