如何在tail命令结果中获取国家/地区代码/名称?

如何在tail命令结果中获取国家/地区代码/名称?

我问过了这个问题关于过滤掉 LOG 文件

日志文件是:

Jan  26 01:05:47 server54 kernel: [41s58.6w4335] INPUT:DROP: IN=eth4 OUT= MAC=d3:ss:43:23:23:43 SRC=1.1.1.1 DST=127.0.0.0 LEN=40 TOS=0x00 PREC=0x00 TTL=254 ID=65259 PROTO=TCP SPT=53252 DPT=22 WINDOW=14600 RES=0x00 RST URGP=0

命令是:

tail -f -n 2 /var/log/kern.log | grep 'INPUT' \
| sed -E 's/^([0-9a-zA-Z: ]*[0-9]{2}:[0-9]{2}:[0-9]{2}).* \
(SRC=[0-9.:]+).*(DST=[0-9.:]+).*$/\1 \2 \3/g'

输出是:

Jan  26 01:05:47 SRC=1.1.1.1 DST=127.0.0.0

现在我需要将结果提供给whois命令以获取源 IP 地址 (SRC=) 的国家/地区(名称或代码),它将给出如下结果:

Jan  26 01:05:47 SRC=1.1.1.1(US) DST=127.0.0.0(GH)

我只是想知道该命令()或bash脚本中是否有这样的功能tail可以进入两个方向,我的意思是,在打印出过滤后的日志后,它通过另一个sed获取源ip地址并删除SRC=:

sed -E 's/^.*(SRC=[0-9.:]+).*$/\1/g'| \
 sed -e 's/SRC=//g' | whois ?!!!

然后将其输入whois命令并返回并将其添加到打印结果中。

或者我必须采用另一种方法,因为在每个管道之后,之前的结果都消失了。

答案1

好吧,虽然可以使用 shell、awk 等来完成这些事情,但使用本地 MaxMind 数据库将为您提供更好、更可预测的性能。使用 Perl 或 Python 等其他语言将为您提供更具可读性的代码,例如使用 Python:

import re
import fileinput
import geoip2.database

reader = geoip2.database.Reader('GeoLite2-City.mmdb')

for line in fileinput.input():
  # Extract source ip using Regexp
  src_ip_search = re.search("SRC=(\S+)", line)
  if src_ip_search is None:
    continue # Didn't find SRC record for some reason
  src_ip = src_ip_search.group(1)
  # Get ISO name of country for that ip from mmdb
  src_iso_code = reader.city(src_ip).country.iso_code
  print(re.sub("SRC=(\S+)", "SRC=\g<1>({})".format(src_iso_code), line)

答案2

例如,您可以使用以下脚本来完成此操作:

out=$(awk '/INPUT/ {print $1,$2,$3,$11,$12}' /var/log/kern.log)
sourcec=$(whois $(echo $out|awk -F'[ =]' '{print $5}')|awk '/Country:/ {print $2}')
targetc=$(whois $(echo $out|awk -F'[ =]' '{print $7}')|awk '/Country:/ {print $2}')

相关内容