有一个/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