Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 解析UFW日志中的IP和端口号_Bash_Shell - Fatal编程技术网

Bash 解析UFW日志中的IP和端口号

Bash 解析UFW日志中的IP和端口号,bash,shell,Bash,Shell,我想写一个脚本来检查我的UFW防火墙日志中被阻止的连接,并取出他们试图连接的源IP和端口。我已经设法把脚本放在一起,分别将它们取出,现在很难让脚本在一行上输出IP和端口。下面是我拥有的防火墙日志和脚本的示例。目前,它输出所有IP,后跟所有端口号。我在每一行上需要的是每个日志条目的源IP地址和相应的目标端口 最终目的是查看每个IP地址试图连接到哪些端口。我的计划是使用uniq-c,一旦我可以从日志中输出每个IP和端口 输入 Nov 26 06:25:11 vps123456 kernel: [62

我想写一个脚本来检查我的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
/script

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
输出

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

针对您的问题的快速
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)");
}
输出(源文件是您的两个示例行):

更新

下面是一个本机
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"