如何通过 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? 进行讨论。
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? 进行讨论。