【问题标题】:Cat error when printing pcap to remote server [closed]将 pcap 打印到远程服务器时出现 Cat 错误 [关闭]
【发布时间】:2021-03-22 20:22:39
【问题描述】:

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

   #!/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 .: 是一个目录

【问题讨论】:

  • 为什么&前面有一个点?
  • 在后台工作
  • 我没想到会有这个答案。只需删除点。
  • 问题是cat:.:是一个目录,
  • 最初的问题是您在命令末尾使用了.& 而不仅仅是&——. 被视为ssh 的一个参数,它将其视为要执行的远程命令的一部分,它被视为cat 的参数,后者将其视为要读取的文件名......并且因为它是一个目录而出现错误。只需删除.(在cat . 命令中,cat. 之间的空格很重要)。

标签: bash cat script


【解决方案1】:

这是更正的版本:

/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)"' &

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

/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: ^

我还用$( )(即cleaner in a couple of ways)替换了反引号,并在生成的文件名周围加上了双引号(不是绝对必要的,但对于包含命令或变量替换的内容来说,这是一种很好的一般做法)。

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

【讨论】:

  • 解决了我的问题。感谢您的解释和回复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
  • 2023-03-18
  • 2018-01-12
  • 1970-01-01
相关资源
最近更新 更多