我正试图编写一个从文件中提取数据的脚本"nohup.out";使用tail-f并在条件下执行dig命令。
#!/bin/bash
nohup proxychains firefox
tail -f nohup.out | xargs if [[ {} == *"denied"* ]]
then
dig -x `cut -d '-' -f 6 {} | cut -d ':' -f 1`&;
fi
nohup.out的输出为
|S链|-<gt-10.1.1.16:80-<gt<gt-93.184.220.29:80-<--拒绝
|S链|-<gt-10.1.1.16:80-<gt<gt-93.184.220.29:80-<--拒绝
|S链|-<gt-10.1.1.16:80-<gt<gt-216.58.209.77:443-<gt<gt-OK
|S链|-<gt-10.1.1.16:80-<gt<gt-46.28.247.89:443-<gt<gt-OK
使用以下命令,我可以提取IP进行反向DNS查找。
cut -d '-' -f 6 | cut -d ':' -f 1
我找不到一种方法将论点传递给cut-and-if命令。
您需要的是将if
语句转换为bash
的参数。做一个简单的转换,假设问题中的代码有机会工作,你会得到:
tail -f nohup.out |
xargs -I '{}' bash -c "if [[ {} == *"denied"* ]]; then dig -x $(cut -d '-' -f 6 {} | cut -d ':' -f 1) & fi"
这与nohup
执行for
循环所需的基本处理方法完全相同——您需要一个shell来运行内置命令。请参阅为什么我不能将Unix nohup
与Bash for
循环一起使用?对于完全类似的情况。
然而,经过进一步思考,您希望剪切作为IP地址的字符串,而不是将其作为名称的文件,因此该命令需要将该字符串回显到cut
命令中。为了正确执行子命令,您还必须竭尽全力;在$(…)
的$
之前需要一个反斜杠,如果坚持使用`…`
表示法,则在每个反斜杠之前都需要反斜杠,并使用反斜杠双引号来保护字符串中的尖括号。
tail -f nohup.out |
xargs -I '{}' bash -c "if [[ '{}' != *denied* ]]; then echo dig -x "$(echo '{}' | cut -d '-' -f 6 | cut -d ':' -f 1)" & fi"
现在我们需要讨论条件和两个cut
命令的使用(以及一般的脱发(。您可以使用:
tail -f nohup.out |
grep -v denied |
xargs -I '{}' bash -c "echo dig -x $(echo '{}' | cut -d '-' -f 6 | cut -d ':' -f 1) &"
或者,更明智地说:
tail -f nohup.out |
awk -F '[-:]' '/denied/ { next } { print "dig -x " $7 " &" }' |
sh -x
或者无数其他方法中的任何一种。
awk -F- '!/denied/ {print $6}'
在由-
分隔的场中分割每个输入行、忽略与denied
匹配的行并提取剩余行中的第6场。以你为例,它输出:
216.58.209.77:443
46.28.247.89:443