停止 CTRL+C 退出正在远程计算机中运行 tcpdump 的本地脚本

停止 CTRL+C 退出正在远程计算机中运行 tcpdump 的本地脚本

我设置了一个简单的脚本,如下所示:

sshpass -p $password ssh -T $username@$ip_address -p 30007 <<- EOF > $save_file.pcap
    sh
    tcpdump -i eth5.1 -s 0 -n -v -U -w -
EOF

sed -i '1d' $save_file.pcap

该脚本的目的是让我可以在远程设备上运行 tcpdump,同时将输出保存到本地计算机上的文件中(远程设备的存储容量非常有限,因此这将允许我获得大量捕获,当然,这也让我能够更快地根据需要设置捕获)。

和heredoc的目的sh是因为默认情况下,我不会被放入该远程设备的适当shell中。在远程设备中发出命令sh可以让我进入正确的 shell 以便能够运行我的 tcpdump,并且此heredoc 是我找到的完成此任务并且仍然将信息移植回本地文件的唯一方法。

我遇到的问题是,一旦脚本到达该脚本的 tcpdump 部分,我的终端就会给出如下输出,就像我在文件中运行 tcpdump 时期望看到的那样:

drew@drew-Ubuntu-18:~/Desktop$ ./Script.sh 
tcpdump: listening on eth5.1, link-type EN10MB (Ethernet), capture size 65535 bytes
Got 665

当然,随着更多数据包被捕获并通过管道传输到我的本地文件中,“得到”计数器也会增加。不幸的是,迄今为止我发现的阻止此行为并返回终端的唯一方法是启动CTRL+ C

这里的问题是,这不仅会停止远程计算机上的 tcpdump,还会结束本地计算机上运行的脚本。

这当然意味着我的脚本中不再运行任何内容,并且我需要使用这些数据执行许多任务,而不仅仅是sed我在此处包含的数据。

我尝试将其设置为如下所示:

tcpdump -i eth5.1 -s 0 -n -v -U -w - &
read -n 1 -s; kill $!

这里的思考过程是,我的原始 tcpdump 信息仍然会发布到标准输出,因此仍然填充在我的本地捕获文件中。然而,似乎当我尝试以这种方式运行捕获时,&它实际上并没有让我将任何其他内容发布到终端中(不确定是否总是有太多垃圾飞行或什么)。我什至在本地尝试过这个,似乎尝试运行原始 tcpdump 发布到 stdout 不会让任何其他事情发生。

根据这些信息,我此时唯一能想到的是是否有某种方式可以使用 +CTRLC关闭远程计算机上的 tcpdump,但保持我的脚本仍在运行。有什么建议我可以尝试吗?或者其他更合乎逻辑的解决方法?

答案1

我建议对您的远程捕获流量脚本进行一些改进:

  1. 防止CTRC+C杀死你的脚本:

    这可以通过使用陷阱来捕获来完成SIGINT。您通常将其放在脚本的开头。看这个例子:

    trap "pkill ssh" INT
    

    显然,仅获取您想要的 ssh 的过滤器可以改进。

  2. 从中过滤掉与远程机器的通信tcpdump

    您告诉我们您的系统对捕获反应不佳,可能是递归数据捕获使系统过载。根据您正在侦听的接口,您可能会创建一个递归情况,在与远程计算机的每个连接中,控制连接数据将被添加到捕获中,这反过来又会生成更多数据包来提供tcpdump

    因此,您tcpdump可能需要过滤掉本地和远程计算机之间的通信。使用类似的东西:

    /usr/bin/tcpdump -i eth5.1 -s 0 -n -v -U -w - "not port 22"
    

    或者:

    /usr/bin/tcpdump -i eth5.1 -s 0 -n -v -U -w - "not my_local_host"
    

    这可能会减轻缓慢和不稳定的情况,因此脚本会表现得更好。另请参阅稍后有关使用的要点nc

  3. 限制传入的数据包数量tcpdump以避免一直使用CTRC+ C

    如果您只想捕获一小部分流量,则应该限制tcpdump捕获的数据包数量tcpdump

    例如捕获 100 个数据包并返回:

    tcpdump -c 100 -w -
    
  4. 限制tcpdump时间以避免一直使用CTRC+ 。C

    如果要捕获 5 分钟(300 秒)的流量,请timeout在远程端使用该命令。如:

    ssh "timeout 300 tcpdump -w -"
    
  5. 丢掉那个壳

    您正在使用 shell,因为您需要 $PATH 来调用tcpdump.改为调用完整tcpdump路径。

    如:

    sshpass -p $password ssh -T $username@$ip_address -p 30007 "/usr/bin/tcpdump -i eth5.1 -s 0 -n -v -U -w -"
    
  6. 取消缓冲tcpdump

    tcpdump输出到tcpdumptostdout被缓冲。要取消缓冲以更快地从远程主机获取数据,并在中断时丢失更少的数据,请使用-l

    /usr/bin/tcpdump -i eth5.1 -s 0 -n -v -U -l -w -
    

    这对您的情况可能有用也可能没用,请进行一些测试。当您使用 CTRL-C 中断它时,它肯定会给您留下更多数据。

  7. 不使用 SSH 来获取流量转储。代替使用netcat

    如果您没有如此严格的安全要求,例如在您自己的网络内进行捕获,并且两台主机之间没有防火墙阻止端口,请放弃该 SSH 以获取tcpdump输出。这是一个计算量很大的协议,如果您需要捕获更多的远程流量,它会妨碍您。而是使用nc它来获取tcpdump数据。

    与本地机器一样:

    nc -l -p 20000 > capture.dump &
    

    远程机器:

    ssh remote "/usr/bin/tcpdump -w - | nc IP_local_machine 20000" > /dev/null
    
  8. 放弃那个sshpass

    使用 ssh 密钥代替密码进行身份验证。

  9. 最后,如果做得更专业,可以考虑使用代理+专业服务的可能性。

    您可以使用cshark.

    捕获流量并直接上传到CloudShark进行分析。使用 CloudShark 服务:https://www.cloudshark.org或您自己的 CloudShark 设备。

相关内容