我想编写一个脚本来检查阻止连接的UFW防火墙日志,并提取他们尝试连接的源IP和端口。我已经设法将脚本放在一起单独提取这些脚本,并且现在很难让脚本在一行上输出IP和端口。下面是我拥有的防火墙日志和脚本的示例。目前它输出所有IP,然后输出所有端口号。我想要的每一行都是来自每个日志条目的源IP地址和相应的目标端口。
最终目标是查看每个IP地址尝试连接的端口。我的计划是使用 uniq -c ,一旦我可以从日志中输出每个IP和端口。
输入
Nov 26 06:25:11 vps123456 kernel: [620802.845897] [UFW BLOCK] IN=ens3 OUT= MAC=fa:16:3e:9f:c7:5d:11:22:33:44:55:66:77:88 SRC=85.93.20.253 DST=10.20.30.40 LEN=40 TOS=0x00 PREC=0x00 TTL=245 ID=5830 PROTO=TCP SPT=51639 DPT=735 WINDOW=1024 RES=0x00 SYN URGP=0
Nov 26 06:27:44 vps123456 kernel: [620955.012996] [UFW BLOCK] IN=ens3 OUT= MAC=fa:16:3e:9f:c7:5d:11:22:33:44:55:66:77:88 SRC=51.15.51.140 DST=10.20.30.40 LEN=433 TOS=0x00 PREC=0x00 TTL=50 ID=42044 DF PROTO=UDP SPT=5088 DPT=5062 LEN=413
./脚本
file="input"
for line in $file; do
addr=$(awk '{match($0,/SRC=[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' $file)
port=$(awk '{match($0,/DPT=[0-9]{0,5}/); port = substr($0,RSTART,RLENGTH); print port}' $file)
echo $addr, $src >> output
done
输出
SRC=85.93.20.253 SRC=51.15.51.140, DPT=735 DPT=5062
答案 0 :(得分:1)
快速php
解决方案问题,将在每行打印源IP地址和相应的目标端口。该脚本逐行读取输入日志文件并处理每一行。使用正则表达式将IP地址和端口号匹配到变量中。
<?php
$infile = $argv[1];
$handle = fopen($infile, "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
preg_match('/.*SRC=(?<ip>[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)(.*DPT=)(?<port>[0-9]+).*/', $line, $m);
if ($m) {
print $m['ip'] . ' ' . $m['port'] . "\n";
}
}
fclose($handle);
} else {
exit("Unable to open file ($finfile)");
}
将上述脚本保存到文件中(即:get-uwf-ip-port.php)后,可以按以下方式运行:
php get-uwf-ip-port.php your_logfile
输出(源文件是两个示例行):
85.93.20.253 735
51.15.51.140 5062
<强>更新强>:
这是一个原生的bash
解决方案。这里的主要思想是逐行读取文件,将每行读入shell变量,使用shell参数扩展提取ip和端口号。
#!/bin/bash
infile="$1"
while read line; do
ip="${line##*SRC=}"
ip="${ip%% *}"
port="${line##*DPT=}"
port="${port%% *}"
echo $ip $port
done < "$infile"
我略微修改了你的awk
代码,将ip和端口匹配在一起,它将产生与上面相同的结果:
awk '{match($0,/SRC=[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART+4,RLENGTH-4); match($0,/DPT=[0-9]{0,5}/); port = substr($0,RSTART+4,RLENGTH-4); print ip,port}' your_logfile