我问过了这个问题关于过滤掉 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}')