如何通过 python 程序消除重复的 IP Table 条目

How to eliminate duplicate IP Table entries through python program

 iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  10.10.10.10          anywhere            tcp dpt:6379
ACCEPT     tcp  --  10.10.10.10          anywhere            tcp dpt:6379

我知道 iptables-save | awk ' !x[[=13=]]++' | iptables-restore 会在 shell 中完成工作,但我想通过每 30 秒运行一次的 python 脚本消除重复的 IP table 条目。

是这样的吗?

import subprocess

old_rules = subprocess.run(
    ["iptables-save"], capture_output=True, text=True, check=True)
new_rules = "".join(f"{rule}\n" for rule in set(old_rules.stdout.splitlines()))
saved = subprocess.run(
    ["iptables-restore"], text=True, check=True, input=new_rules)

中线略显紧凑;它可以更易读地改写为

new_rule_lines = set(old_rules.stdout.splitlines())
new_rules = "\n".join(new_rule_lines) + "\n"

set操作是这里删除重复的操作; Python set 被定义为不可能有重复项的集合。

最后的换行符对于某些应用程序很重要,而其他应用程序会愉快地读取缺少最后换行符的输入(尽管 POSIX 对于文本文件和流来说是必需的)。

如果保持原始顺序是一项要求,Python 的最新版本中的 set() 应该可以做到这一点,但您可能想要探索,例如Does Python have an ordered set? 进行讨论。