我使用nfcapd来捕获Netflow导出数据包。它有一个-x选项,可在新的流输出文件可用时调用另一个程序。我想在新文件可用时调用nfdump,所以我像这样运行nfcapd:
#!/bin/bash
t="nfcapd -p 5566 -l /root/nfcapd_log/ -t 5 -x \"nfdump -r %d%f \""
echo $t
eval $t
当我在屏幕上看到它的输出时,它会调用nfdump。
我将路径从nfcapd传递给新文件到nfdump中的-r选项。
我的问题是我需要将fmt: %ts %te %td %pr %sa %da %sp %dp %ra %in %out %pkt %ipkt %opkt %ibyt %obyt %fl %dir %ismc %odmc %idmc %osmc
作为参数传递给nfdump,这是一个字符串来告诉它我想要什么类型的流信息,所以它需要在引号中。我试过逃避报价,但我无处可去。到目前为止,这是我的脚本:
#!/bin/bash
t1="nfcapd -p 5566 -l /root/nfcapd_log/ -t 5 -x \"nfdump -r %d%f -o \\\"fmt: %ts %te %td %pr %sa %da %sp %dp %ra %in %out %pkt %ipkt %opkt %ibyt %obyt %fl %dir %ismc %odmc %idmc %osmc\\\" \" "
echo $t1
eval $t1
但是nfdump并不喜欢格式,因为打印了帮助信息。
我对bash相当新,所以可能有一个非常简单的解决方案。任何帮助将不胜感激。
感谢。
答案 0 :(得分:1)
首先,您可以通过使用辅助函数(在下面的示例中称为output_and_exec())来删除一级引号,该函数输出并执行传递给它的内容。然后,在将命令传递给nfcapd时使用单引号。这些单引号可以包含除单引号之外的任何字符,因此只需使用双引号作为nfdump的参数。
output_and_exec() { echo "$@" ; "$@" ; }
output_and_exec nfcapd -p 5566 -l /root/nfcapd_log/ -t 5 -x 'nfdump -r %d%f -o "fmt: %ts %te %td %pr %sa %da %sp %dp %ra %in %out %pkt %ipkt %opkt %ibyt %obyt %fl %dir %ismc %odmc %idmc %osmc"'
免责声明:由于我没有参加nfapd / nfdump计划,我没有对此进行过测试。