我已经设置了一个简单的脚本,如下所示:
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
是因为默认情况下,我不会被放入此远程设备的适当外壳中。在远程设备中发出sh
让我能够运行我的 tcpdump 的正确 shell,而这个 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
当然,随着越来越多的数据包被捕获并通过管道传输到我的本地文件中,“Got”计数器也会增加。不幸的是,到目前为止,我发现停止此操作并返回终端的唯一方法是启动CTRL
+ C
。
这里的问题是,这不仅会停止远程机器上的 tcpdump,还会结束在我的本地机器上运行的脚本。
这当然意味着我的脚本中没有任何进一步的运行,并且除了sed
我在这里包含的数据之外,我还需要使用这些数据执行许多任务。
我试图改为设置如下:
tcpdump -i eth5.1 -s 0 -n -v -U -w - &
read -n 1 -s; kill $!
这里的思考过程是我的原始 tcpdump 信息仍将发布到标准输出,因此仍将填充到我的本地捕获文件中。但是,似乎当我尝试以这种方式运行捕获时&
,它实际上并没有让我在终端中发布任何其他内容(不确定是否总是有太多的垃圾飞行或什么)。我什至在本地尝试过,似乎尝试将原始 tcpdump 发布到标准输出并不会让其他任何事情发生。
基于这些信息,此时我唯一能想到的就是我是否可以使用某种方式使用CTRL
+C
来关闭远程计算机上的 tcpdump,但保持我的脚本仍在运行。我可以尝试任何建议吗?或者其他更合乎逻辑的方法?