如何使用 syslog 进行其他输出(显示 whois-查询)?

如何使用 syslog 进行其他输出(显示 whois-查询)?

有一个/var/log/syslog 包含 IP 地址输出的日志文件,例如SRC=10.158.0.1

我想从这个文件中扫描每个打印的地址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 地址以及如何使用whois此 ip 地址进行命令?

/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 脚本会工作,但由于提供商已启用防火墙(因为 no-spy-act ?),因此输出很少。这样,通过 2016 年 6 月 22 日的添加,这个线程已针对 16.04 实现

答案1

还有另一种解决方案:

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

如果只想选择syslog包含字符串的行INVALID STATE,那么上面的代码可以修改如下

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

答案2

您可以使用sed命令从文件中提取所有 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命令whois对每个输出的地址调用一次sed


或者,你可以先找到并记录匹配的行,然后分别提取 IP 地址:

grep -eSRC=[0-9.]* /var/log/syslog | tee grep-output.txt | sed 's/^.*SRC=\([0-9.]*\).*$/\1/' | xargs -n1 whois >> whois-output.txt`

答案3

也许下面的代码对你来说是一个合适的起点。它可能不是最佳解决方案,但它能完成它的工作。

它由一个 for 循环组成,循环遍历 $() 内命令的所有输出行。在循环的每次迭代中,一行输出存储在变量 IP 中。然后,在循环中,使用 $IP(变量 IP 的内容)作为参数调用 whois 命令。

括号 $() 包含两个 grep 命令 - 第一个命令搜索前面写有 SRC= 的 IP 地址,第二个命令获取第一个命令的输出(通过管道 |)并只获取 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

答案4

添加选项 - 如果弹出“无效状态” - 那么可以这样做吗?:

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

相关内容