如何将 syslog 用于 else 输出(显示 whois - query)?

dsc*_*001 7 command-line bash networking

/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
Run Code Online (Sandbox Code Playgroud)

有人可以帮帮忙吗?我应该如何定义 ip-address 以及如何使用whois带有这个 ip-address 的命令?

/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-script 可以工作,但输出很少,因为提供者启用了防火墙(因为没有间谍行为?)。这样,通过 2016 年 6 月 22 日的添加,此线程已在 16.04 上实现

enz*_*tib 8

另一个解决方案:

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
Run Code Online (Sandbox Code Playgroud)

如果只想选择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
Run Code Online (Sandbox Code Playgroud)


csc*_*ney 5

您可以使用sed命令从文件中提取所有 ip 的 IP 地址,然后用于为每个匹配xargs运行whois

sed 's/^.*SRC=\([0-9.]*\).*$/\1/;t;d' < /var/log/syslog | xargs -n1 whois >> output.txt
Run Code Online (Sandbox Code Playgroud)

s/^.*SRC=\([0-9.]*\).*$/\1/命令仅用 IP 地址替换包含 SRC=xxxx 的行。

't;d' 命令跳过不匹配的行(从而避免单独的grep命令)。

xargs命令whoissed输出的每个地址调用一次。


或者,您可以先查找并记录匹配的行,然后单独提取 IP 地址:

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