2015-11-25 39 views
2

我想写一个netcat流到本地文件,但我想也实时注释每个流条目与一些元数据(即连接的源IP),因为我将使用多个将写入同一文件的流。写一个Netcat流到文件与其他文本

例如,以下(bash命令)正常工作:

nc 192.168.0.1 443 >> result.txt & echo -n "| Source: 192.168.0.1 | " >> result.txt 

与上述代码的问题是,它将只输入元数据的第一次。因此,输出如下所示:

Source: 192.168.0.1 | !* Connected! 
X 
Y 
Z 

我想要的结果书面这个样子:

Source: 192.168.0.1 | !* Connected! 
Source: 192.168.0.1 | X 
Source: 192.168.0.1 | Y 
Source: 192.168.0.1 | Z 
Source: 192.168.0.2 | A  #<--Written From different netcat stream 

不幸的netcat完成后,我不能运行一个脚本来添加元数据文本它的工作,因为我需要一些方法来识别正在写入的流,因为多个流将写入同一个文件。主要是在bash或python中寻找解决方案。

回答

1

尝试SED(小号 tream itor):

nc 192.168.0.1 443 | sed -u 's/^/Source: 192.168.0.1 | /g' >> results.txt 

这应该与Source: 192.168.0.1 |tail -f some.file | sed -u 's/^/Source: 192.168.0.1 | /g'>t.txt测试,并得到了替换文本每行^的开头:

Source: 192.168.0.1 | line one 
Source: 192.168.0.1 | line two 
Source: 192.168.0.1 | ... 
Source: 192.168.0.1 | line n 

nb:-u标志是为了防止sed使用缓冲。该标志仅在Linux下支持,而不是在Mac OSX上支持。

+0

谢谢。这几乎是所需的解决方案。当我运行命令nc 192.168.0.1 443 |时sed's/^/Source:192.168.0.1 |/g'我完全按照我的需要看到结果(写入stdout)。但是,当我使用>> results.txt时,它不写入或附加到文件。我玩过重定向输出,但仍然没有运气。只要我弄清楚这最后一块,我会将其标记为最佳答案。 – Karimi

+0

问题是由缓冲引起的。默认情况下,如果输出到达终端,则每条线都会立即显示,但如果输出到达文件,则会缓冲更大的块(4-64kB),并且只有在缓冲区满后才写入文件。看到[这个问题](http://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe)也许有一个答案可以帮助你。 – Thawn

+1

在Linux上,我找到了一个解决方案,只需将'-u'标志添加到sed命令。我希望这有帮助。 – Thawn

相关问题