我正在处理一个bash脚本,它捕获信标帧数据包(没有坏fcs)并以首选格式输出它们,但我有问题将输出管道重定向到文件。
当我重定向到名为temp
tcpdump -I -i mon0 -vv 2>/dev/null|awk -F ',| ' 'BEGIN{printf "%-10s %-25s%-10s\n","OPTION NO.","ESSID(Beacon Frames)","CHANNEL NO."};$0~/Beacon/{for(i=1;i<=NF;++i){if(($i~/^\([^^]+\)$/) && !($i in arr) && ($0~/CH:/) && !($0~/tsft bad-fcs/)){NR=++c;arr[$i]=1;gsub(/\(|\)/,"",$i);printf("%-10s %-25s",NR,$i);for(x=1;x<=NF;++x){if($x~/^CH:/){print $x " "$(x+1) "\tHit Ctrl+C to stop scan"}}}}}' >> temp
当我没有重定向到文件时(显示输出),上面的命令行在终端中工作正常。当我重定向到文件时,我看到文件存在没有输出。
我尝试了以下
1.管理命令行输出,如tee -a temp
(输出到stdout和文件)
例如
tcpdump -I -i mon0 -vv 2>/dev/null|awk -F ',| ' 'BEGIN{printf "%-10s %-25s%-10s\n","OPTION NO.","ESSID(Beacon Frames)","CHANNEL NO."};$0~/Beacon/{for(i=1;i<=NF;++i){if(($i~/^\([^^]+\)$/) && !($i in arr) && ($0~/CH:/) && !($0~/tsft bad-fcs/)){NR=++c;arr[$i]=1;gsub(/\(|\)/,"",$i);printf("%-10s %-25s",NR,$i);for(x=1;x<=NF;++x){if($x~/^CH:/){print $x " "$(x+1) "\tHit Ctrl+C to stop scan"}}}}}'|tee -a temp
我试过
exec > temp
command line above
这可能是一个缓冲问题,因为数据包捕获很快?
如何将上述命令行的结果重定向到文件?
注意:命令行中的mon0
表示我使用airmon-ng
在我的无线适配器上启动的监视器界面
编辑:代码细分如下
BEGIN {
FS=",| "
printf "%-10s %-25s%-10s\n","OPTION NO.","ESSID(Beacon Frames)","CHANNEL NO."
}
$0~/Beacon/ {
for(i=1;i<=NF;++i) {
if(($i~/^\([^^]+\)$/) && !($i in arr) && ($0~/CH:/) && !($0~/tsft bad-fcs/)) {
NR=++c
arr[$i]=1
gsub(/\(|\)/,"",$i)
printf("%-10s %-25s",NR,$i)
for(x=1;x<=NF;++x) {
if($x~/^CH:/) {
print $x " "$(x+1) "\tHit Ctrl+C to stop scan"
}
}
}
}
}
正如我所提到的,代码工作得很好..这只是重定向问题..如果需要,可以对代码进行改进。
答案 0 :(得分:0)
可能不是答案,我没有永远与bash合作,但可能尝试将其发送到文本文件。 temp可以被视为目录。相反,尝试exec&gt; TEMP.TXT
答案 1 :(得分:0)
在对awk和gawk进行了一些阅读之后。我在我的一篇文章中遇到了一个关于缓冲行为的非常有趣的话题。这解决了我的问题..我使用以下内容改变了awk的缓冲行为
fflush("") ==> gawk and newer versions of awk
或
system("")==> older versions of awk
这会强制awk立即为每个输入行刷新其输出。
我在命令行中尝试了上述每个功能,我的输出立即被重定向到我的文件temp
。