如何使用syslog for else输出(显示whois – 查询)?
有log-file /var/log/syslog
和ip-addresses的输出,例如SRC=10.158.0.1
。
我想从这个文件中扫描SRC= ...
每个打印地址SRC= ...
然后用whois (SRC= ...)
进行查询whois (SRC= ...)
。
应该监视此查询。
我的尝试是错误的,在bash脚本中看起来像这样:
#/bin/bash while [ 1 ] do grep 'SRC=ip-address' /var/log/syslog >> /home/$user/topsecret001/pitbull001.txt; whois 'SRC=ip-address' >> /home/$user/topsecret001/pitbull002.txt; done
有人可以帮忙解决问题吗? 我应该如何定义ip-address以及如何在此ip-address中使用命令whois
?
/ var / log / syslog的输出在这里看起来像这个片段:
http://paste.ubuntu.com/5859332/
/ var / log / syslog的输出如下所示 – 当有一点警报时(如今):
http://paste.ubuntu.com/5862958/
想法也是 – 只有在滚动系统日志的行中弹出“无效状态”时才执行whois查询。
感谢您的贡献。 我已经用你的代码学到了一些东西。 通常解决方案看起来比想象的要容易 – 因为我认为这会更困难。 我认为enzotib最近的贡献,现在这个问题已经解决了。
请参阅今日(2016年6月22日)的新评论,提及16.04:
因为这个bash脚本是ipv4的时候 – 那么/etc/sysctl.conf是否需要取消注释才能启用ipv4? – 那么这个脚本会运行吗? 否则就像以前一样没有whois输出。 通过取消注释/etc/sysctl.conf的第28行和第33行检查了这一点 – 然后这个线程中的这个bash脚本可以工作,但由于提供程序启用了防火墙(因为没有间谍行为?),所以输出的输出非常少。 这种方式通过2016年6月22日的这个添加,该线程实现为16.04
又一个解决方案:
awk '{ for (i = 1; i <= NF; i++) if ($i ~ /^SRC=/) print substr($i, 5) }' /var/log/syslog | sort -u | while read ip; do printf ' === %s ===\n' "$ip" whois "$ip" done
如果您只想选择包含字符串INVALID STATE
的syslog
行,则可以按如下方式修改上述代码
awk '/INVALID STATE/ { for (i = 1; i <= NF; i++) if ($i ~ /^SRC=/) print substr($i, 5) }' /var/log/syslog | sort -u | while read ip; do printf ' === %s ===\n' "$ip" whois "$ip" done
您可以使用sed
命令从文件中提取所有IP IP地址,然后使用xargs
为每个匹配运行whois
:
sed 's/^.*SRC=\([0-9.]*\).*$/\1/;t;d' < /var/log/syslog | xargs -n1 whois >> output.txt
s/^.*SRC=\([0-9.]*\).*$/\1/
命令仅用IP地址替换包含SRC = xxxx的行。
‘t; d’命令跳过不匹配的行(从而避免单独的grep
命令)。
xargs
命令为sed
输出的每个地址调用一次whois
。
或者,您可以先找到并记录匹配的行,然后分别提取IP地址:
grep -eSRC=[0-9.]* /var/log/syslog | tee grep-output.txt | sed 's/^.*SRC=\([0-9.]*\).*$/\1/' | xargs -n1 whois >> whois-output.txt`
也许以下代码是适合您的起点。 它可能不是最佳解决方案,但它可以完成它的工作。
它由$()中命令的所有输出行组成的for循环组成。 在循环的每次迭代中,一行输出存储在变量IP中。 然后,在循环中,使用$ IP(变量IP的内容)作为参数调用whois命令。
括号$()包含两个grep命令 – 第一个是搜索IP地址,其中SRC =写在它们前面,第二个接受第一个输出(通过管道|),只取IP地址。 grep的-o标志使它只输出匹配的行部分而不是整行。
正则表达式也不是很优雅。 它正在搜索三个组,每个组由一到三个数字和一个点组成,后面再跟一到三个数字。 为了保持脚本可读,我选择使用-E扩展正则表达式。 “普通”grep命令需要在每一轮和大括号前面加一个反斜杠…
for IP in \ $(grep -E "SRC=([0-9]{1,3}\.){3}[[0-9]{1,3}" -o /var/log/syslog | \ grep -E "([0-9]{1,3}\.){3}[[0-9]{1,3}" -o); do whois $IP; done
您的脚本应如下所示:
#/bin/bash grep 'SRC=' /var/log/syslog | awk 'BEGIN {FS="[ \t]+|\\|"} {print $13}' | uniq >> ~/topsecret001/pitbull001.txt for ip in $(sed -e 's/SRC=//g' ~/topsecret001/pitbull001.txt) do whois $ip >> ~/topsecret001/pitbull002.txt done
要添加选项 – 如果弹出“无效状态” – 那么会这样吗? :
awk '{ for (i = 1; i <= NF; i++) if ($i ~ /^SRC=/) print substr($i, 5) }' /var/log/syslog | sort -u | while read ip; do printf ' INVALID STATE ' && printf ' === %s ===\n' "$ip" whois "$ip" done