我正在尝试运行以下命令:
$ tcpdump -l -X -i eth1 -n tcp port <port> | tee capture.txt | \
scp capture.txt [email protected]:/home/checker/
tcpdump -l -X -i eth1 -n tcp port <port>
在步骤#1中,我正在捕获数据包,使用“-l”来制作标准输出行缓冲,以便它在每个数据包到达时写入它。
tee capture.txt
在步骤 #2 中
man tee
:“tee 实用程序将标准输入复制到标准输出,在零个或多个文件中制作副本。”输出是无缓冲的。scp capture.txt root@<remote-IP>:/home/
在步骤 #3 中,我将 capture.txt 文件发送到远程主机。
问题
如果我只是执行步骤 #1 和 #2,所有数据包都会在指定端口上捕获。但是,如果我也使用步骤#3,则capture.tx
t 不包含所有数据包(只有少数)...这让我很沮丧,因为几分钟前我已经运行正常了!
这里有什么问题吗?
答案1
该tee
命令在收到数据时将数据写入输出文件,但scp
立即复制文件,并且仅复制一次。由于管道中的每个命令同时运行(或几乎同时运行),因此您只能获得几个(或没有)数据包输出到捕获.txt文件被复制之前的文件scp
。
有几种方法可以做您想做的事情。
如果您想从 复制一些数据包tcpdump
,然后在完成后将文件传输到远程主机,您可以使用该选项在捕获该数量的数据包后-c
终止。使用分号将命令与管道tcpdump
分开,以便在和命令完成后执行:scp
tcpdump
tee
tcpdump -l -c 10 | tee /tmp/capture.txt; scp /tmp/capture.txt root@remotehost:/tmp
或者,如果您想要实时查看数据包并实时复制它们,您可以使用tee
将数据包输出到 /dev/tty 以便您可以看到它们,然后将它们通过管道传输到将ssh
它们写入远程主机上的文件的命令中:
tcpdump -l | tee /dev/tty | ssh root@remotehost "cat > /tmp/capture.txt"
请注意,如果没有-c
此处的选项,tcpdump 将运行直到您终止它。
如果您希望将数据包存储在本地和远程的 capture.txt 文件中,您可以使用多个tee
命令:
tcpdump -l | tee /tmp/capture.txt | tee /dev/tty | ssh root@remotehost "cat > /tmp/capture.txt"
答案2
当 scp 读取 capture.txt 时,不能保证 tee 已完成写入。你可以做的是使用 tee 的 stdout 并通过 ssh 将其通过管道传输,如下所示:
tcpdump -l -X -i eth1 -n tcp port <port> | tee capture.txt | \
ssh [email protected] 'cat > /home/checker/capture.txt'
答案3
我认为这里的问题是,您要复制的文件scp
是在某个时刻复制的,而不是连续复制的,因此您最终会在服务器 10.3.3.227 上得到该文件内容的片段。
试试这个:
$ sudo tcpdump -l -X -i eth1 -n <tcp port> | tee capture.txt | \
ssh [email protected] 'cat > /home/checker/capture.txt