如何使用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 STATEsyslog行,则可以按如下方式修改上述代码

 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