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 上实现
另一个解决方案:
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)
您可以使用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命令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`
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1156 次 |
| 最近记录: |