运行 tcpdump、tee 和 scp

运行 tcpdump、tee 和 scp

我正在尝试运行以下命令:

$ tcpdump -l -X -i eth1 -n tcp port <port> | tee capture.txt | \
       scp capture.txt  [email protected]:/home/checker/
  1. tcpdump -l -X -i eth1 -n tcp port <port>

    在步骤#1中,我正在捕获数据包,使用“-l”来制作标准输出行缓冲,以便它在每个数据包到达时写入它。

  2. tee capture.txt

    在步骤 #2 中man tee:“tee 实用程序将标准输入复制到标准输出,在零个或多个文件中制作副本。”输出是无缓冲的。

  3. scp capture.txt root@<remote-IP>:/home/

    在步骤 #3 中,我将 capture.txt 文件发送到远程主机。

问题

如果我只是执行步骤 #1 和 #2,所有数据包都会在指定端口上捕获。但是,如果我也使用步骤#3,则capture.txt 不包含所有数据包(只有少数)...这让我很沮丧,因为几分钟前我已经运行正常了!

这里有什么问题吗?

答案1

tee命令在收到数据时将数据写入输出文件,但scp立即复制文件,并且仅复制一次。由于管道中的每个命令同时运行(或几乎同时运行),因此您只能获得几个(或没有)数据包输出到捕获.txt文件被复制之前的文件scp

有几种方法可以做您想做的事情。

如果您想从 复制一些数据包tcpdump,然后在完成后将文件传输到远程主机,您可以使用该选项在捕获该数量的数据包后-c终止。使用分号将命令与管道tcpdump分开,以便在和命令完成后执行:scptcpdumptee

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

相关内容