python 控制 iptabless 使用配置文件

python control iptabless use config file

朋友们, 使用 python 2.7.3 我想在 file1.txt 手册中写一些 ipaddrss,每行一个 ip。 如何使用python读取file1.txt所有ipaddress,放入file2.txt另存为file3.txt?

file1.txt

1.1.1.1
2.2.2.2
3.3.3.3
...
5.5.5.5
...
10.10.10.10

file2.txt

:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p udp -m udp --dport 137 -j ACCEPT
-A INPUT -p udp -m udp --dport 138 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 139 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 445 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

file3.txt

:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp -s 1.1.1.1 --dport 1080 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp -s 2.2.2.2 --dport 1080 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp -s 3.3.3.3 --dport 1080 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp -s 4.4.4.4 --dport 1080 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp -s 5.5.5.5 --dport 1080 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp -s 6.6.6.6 --dport 1080 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp -s 7.7.7.7 --dport 1080 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp -s 8.8.8.8 --dport 1080 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp -s 9.9.9.9 --dport 1080 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp -s 10.10.10.10 --dport 1080 -j ACCEPT
-A INPUT -p udp -m udp --dport 137 -j ACCEPT
-A INPUT -p udp -m udp --dport 138 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 139 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 445 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

由于您的第二个文件并没有真正改变,因此似乎不需要它。通常,您有几行 "fixed" 字符串,然后您想要添加几行不同的内容(至少是 IP),然后您将再次添加一些 "fixed" 字符串。文件开头和结尾的这几行不变字符串也可以直接写在 python 代码中。

这样做,您最终会得到一个 IP 列表和一个 python 脚本。 运行 脚本将生成您想要的输出 - 所有 Ip/firewall 相关的内容都将直接写入脚本代码中,并且可以在需要时在那里进行编辑。

因此,您需要读写 from/to 个文件和一个循环。这并不难,我想阅读以下网站将帮助您弄清楚需要什么:

  1. Input and Output - Reading and Writing Files. 一般信息,关于 reading/writing 和文件
  2. How to open a file using the open with statement. 打开和读取文件的推荐方法 - with 语句。按照上面提到的 "normal" 方法完成后,请改用此方法。
  3. For-Loop. 您有一个 IP 列表,因此您需要遍历每一行,以便在结果文件中写入所需的输出。以防万一它不明显,你可以为此使用一个简单的 for-loop。
  4. String concatenation vs. string substitution. 因为您不想只将 IP 写入生成的文件,而是要向其中添加其他字符串,您需要以某种方式创建此字符串。有多种方法可以做到这一点,这里提到了两种最常见的方法。

利用这些知识,您...

  1. 创建输出文件
  2. 写下没有变化的那几行
  3. 打开并阅读您的 IP 列表
  4. 遍历列出的所有 IP
  5. 使用字符串替换(或连接)为 IP 生成完整字符串
  6. 也将该字符串写入结果文件
  7. 重复第 5 步和第 6 步,直到完成所有 IP
  8. 在结果文件末尾写下几行不变的内容
  9. 完成!

如果这对您不起作用,请编辑您的问题并显示您正在使用的代码。

当然可以真正使用两个输入文件来生成输出,但这需要更多的编码工作,也许并不真正需要。如果您坚持这样做,请尝试我首先提到的 - 您可以随时扩展您的脚本。

您要做的是合并两个文件的内容,将来自 file1.txt 的内容插入到 file2.txt 中。我从你的例子可以看出插入点在file2.txt的第7行之后,但是,file2.txt的插入点是如何确定的?

如果假设你总是在那个点插入,你可以打开file2.txtfile3.txt,从file2.txt读取7行并将这些行写入[=16] =].然后你可以将转换后的IP地址插入到file3.txt中。最后 file2.txt 的其余部分被读取并写入 file3.txt。执行此操作的一些代码如下所示:

INSERT_AFTER_LINE = 7
template = '-A INPUT -p tcp -m state --state NEW -m tcp -s {ip} --dport 1080 -j ACCEPT\n'

with open('file2.txt') as file2, open('file3.txt', 'w') as file3:
    for i in range(INSERT_AFTER_LINE):
        file3.write(file2.readline())
    with open('file1.txt') as file1:
        for line in file1:
            file3.write(template.format(ip=line.strip()))
    file3.write(file2.read())

如果文件的顺序无关紧要,则此任务会得到简化,因为您可以在文件末尾附近添加新规则,在 COMMIT 之前。但是,我认为顺序对于 iptables 规则很重要。