我正在尝试编写一个脚本,该脚本使用tail -f从文件“nohup.out”中提取数据并在条件下执行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链| - <> -10.1.1.16:80-<><> -93.184.220.29:80-< - 否认
| S链| - <> -10.1.1.16:80-<><> -93.184.220.29:80-< - 否认
| S链| - <> -10.1.1.16:80-<><> -216.58.209.77:443-<><> -OK
| S链| - <> -10.1.1.16:80-<><> -46.28.247.89:443-<><> -OK
使用以下命令,我可以提取IP以进行反向DNS查找。
cut -d '-' -f 6 | cut -d ':' -f 1
我无法找到将参数传递给cut和if命令的方法。
答案 0 :(得分:1)
您需要将if
语句转换为bash
的参数。做一个简单的转换,假设问题中的代码有可能工作,你得到:
tail -f nohup.out |
xargs -I '{}' bash -c "if [[ {} == *"denied"* ]]; then dig -x $(cut -d '-' -f 6 {} | cut -d ':' -f 1) & fi"
这与for
执行nohup
循环所需的基本处理完全相同 - 您需要一个shell来运行内置命令。有关完全类似的情况,请参阅Why can't I use Unix nohup
with Bash for
loop?。
但是,在进一步思考时,您希望剪切作为IP地址的字符串,而不是将其作为名称的文件,因此该命令需要将字符串回显到cut
命令中。你也必须撕裂你的头发才能正确执行子命令;如果您坚持使用$
表示法,并且使用反斜杠双引号来保护,则需要在$(…)
的{{1}}之前或者在每个反向标记之前使用反斜杠字符串中的尖括号。
`…`
现在我们需要讨论条件的使用和两个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) &"
或任何其他无数方法。
答案 1 :(得分:0)
awk -F- '!/denied/ {print $6}'
将每个输入行拆分为由-
分隔的字段,忽略匹配denied
的行并提取剩余行的第6个字段。以你为例,它输出:
216.58.209.77:443
46.28.247.89:443