【发布时间】:2017-03-13 04:00:41
【问题描述】:
我的路由器通过 syslog 将其“DROP”数据包发送到我的服务器,以便以下列方式记录到文件中:
10 月 30 日 13:01:02 192.168.1.1 内核:DROP IN=vlan2 OUT= MAC=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx SRC=93.108.197.92 DST=192.168.2.10 LEN=60 TOS=0x00 PREC=0x00 TTL=51 ID=44828 DF PROTO=TCP SPT=55552 DPT=33248 窗口=7300 RES=0x00 SYN URGP=0 选择 (020405840402080A0035BAC40000000001030300)
10 月 30 日 13:01:06 192.168.1.1 内核:DROP IN=vlan2 OUT= MAC=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx SRC=93.108.197.92 DST=192.168.2.10 LEN=60 TOS=0x00 PREC=0x00 TTL=51 ID=44829 DF PROTO=TCP SPT=55552 DPT=33248 窗口=7300 RES=0x00 SYN URGP=0 选择 (020405840402080A0035BEAE0000000001030300)
10 月 30 日 13:01:07 192.168.1.1 内核:DROP IN=vlan2 OUT= MAC=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx SRC=189.175.171.76 DST=192.168.2.10 LEN=44 TOS=0x00 PREC=0x00 TTL=53 ID=260 PROTO=TCP SPT=14779 DPT=23 WINDOW=50523 RES=0x00 SYN URGP=0 OPT (020405AC)
10 月 30 日 13:01:09 192.168.1.1 内核: 下拉=vlan2 输出= MAC=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx SRC=125.211.218.39 DST=192.168.1.1 LEN=88 TOS=0x00 PREC=0x00 TTL=48 ID=39896 DF PROTO=ICMP TYPE=8 CODE=0 ID=29389 SEQ=1
10 月 30 日 13:01:14 192.168.1.1 内核:DROP IN=vlan2 OUT= MAC=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx SRC=93.108.197.92 DST=192.168.2.10 LEN=60 TOS=0x00 PREC=0x00 TTL=51 ID=44830 DF PROTO=TCP SPT=55552 DPT=33248 窗口=7300 RES=0x00 SYN URGP=0 选择 (020405840402080A0035C6800000000001030300)
我想将每个字段放入一个 mysql 数据库中,以便稍后查看和分析。我正在尝试考虑解析/过滤/执行此操作的最佳方法。我想用 bash 来做,但如果它能让它更高效或更容易,我愿意接受其他替代方案/语言。
我的 iptables 日志文件经常轮换,我将创建一个 bash/sed/awk 脚本来查看日志的每一行并创建一个 sql 文件,以便我可以使用“加载数据输入文件” ' 命令将所有数据加载到一个 INSERT 语句中。
正如您在上面看到的,ICMP 和 TCP 类型的数据包将与写入文件的方式不同(ID 后面的字段数)
我有几种不同的方法来完成这个:
- 按 PROTO 搜索,其余的 awk 'print' 命令用于获取所有相关信息。
- 在每一行中搜索所有 [PARAM]=[VALUE],而不考虑 PROTO,然后将它们推入 mysql 并稍后分析。
到目前为止(我知道这是基本的,但我想知道在投入更多时间之前是否应该以不同的方式处理它):
cat "$fw_file" | while read line; do
type=$(grep -oP 'PROTO=\w+\s' | cut -d= -f2)
df=$(grep -oP 'ID=\w+\sDF\s' | cut -d' ' -f2)
# continuing on for all fields....
# ......
done
如果我有更好、更有效的方法来做到这一点,而不是仅仅抓住所有领域?
【问题讨论】:
-
shell 只是一个调用工具的环境。要将文本从一种格式转换为另一种格式,您应该改用 awk。请参阅 why-is-using-a-shell-loop-to-process-text-considered-bad-practice 了解一些(但不是全部)不继续您开始的内容的原因,并阅读 Arnold Robbins 的《Effective Awk Programming, 4th Edition》一书,以便学习正确的方法。使用编辑器
{}按钮修复您的输入格式,并添加给定输入的预期输出。 -
这并没有真正回答我的问题。您说我应该使用 awk 并阅读有关 awk 的书。您认为 awk 是进行这种数据过滤的最佳、最有效的方法吗?你认为我应该使用 python 而不是一般的 bash 或 shell 吗?
-
没错,问题的答案作为答案发布。我提供的其他信息作为评论发布。知道你想做什么,因为你还没有完成我上周在评论中建议的事情 (
Fix your input format using the editors {} button and add the expected output given that input.) 所以我当然不知道最好的方法,但总的来说 awk 是迄今为止你最好的选择用于 UNIX 中的通用文本操作。