首页 > 解决方案 > 将 pcap 打印到远程服务器时出现 Cat 错误

问题描述

脚本如下;当我手动运行它时,没有问题,但是

   #!/bin/bash

/usr/bin/sudo /usr/sbin/tcpdump -i any -Z user -s 0 -v port xxx or xxx -w - | ssh root@xx.xx.xx.xx -C 'cat - > /opt/pcap/trace.`date +\%s`' .&

sleep 10
pkill tcpdump
exit 

sh -x 输出如下。可能是什么问题呢?

cat .: 是一个目录

标签: bashcatscript

解决方案


这是更正后的版本:

/usr/bin/sudo /usr/sbin/tcpdump -i any -Z user -s 0 -w - -v port xxx or xxx | ssh root@xx.xx.xx.xx -C 'cat - > "/opt/pcap/trace.$(date +\%s)"' &

原来的版本有两个问题,最后的杂散.字符&,以及在过滤器表达式之后的-w -选项tcpdump(选项必须在表达式之前):

/usr/bin/sudo /usr/sbin/tcpdump -i any -Z user -s 0 -v port xxx or xxx -w - | ssh root@xx.xx.xx.xx -C 'cat - > /opt/pcap/trace.`date +\%s`' .&
                                                        problems here: ^^^^                                                       and here: ^

我还用 替换了反引号$( ),这在几个方面更清晰,并在生成的文件名周围加上双引号(不是绝对必要的,但对于包含命令或变量替换的东西来说,这是一个很好的一般做法)。

由于缺少空格,您在评论中尝试的版本还有几个额外的问题:-Z username-s 0代替-Z username -s 012345-w -代替12345 -w -. 空格是 shell 语法中的重要分隔符,因此请注意不要添加或删除它们,除非您知道它在该特定位置是安全的。在这里,可以删除选项与其参数之间的空格(例如,-Zusername -s0而不是-Z username -s 0),但删除参数和下一个选项之间的空格会导致混乱。


推荐阅读