python控件iptabless使用配置文件

时间:2015-04-02 02:08:17

标签: python replace iptables

我的朋友们, 使用python 2.7.3 我想在file1.txt手册中写一些ipaddrs,每行一个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

2 个答案:

答案 0 :(得分:0)

由于你的第二个文件并没有真正改变,似乎根本不需要。一般来说,你有一些"固定"字符串,然后你想添加一些变化的行(至少是IP),然后你将添加一些"固定"字符串,再次。因此,您希望在文件的开头和结尾处输入几行不变的字符串也可以在python代码中编写。

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

因此,您需要从/向文件和循环读取和写入。它并不难,我想阅读以下网站将帮助您找出所需的内容:

  1. Input and Output - Reading and Writing Files.关于阅读/写作和文件的一般信息
  2. How to open a file using the open with statement.推荐的打开和读取文件的方法 - with语句。做完之后"正常"如上所述,请改用此方法。
  3. For-Loop.您有一个IP列表,因此您需要迭代每一行,以便在结果文件中写入所需的输出。为了防止它显而易见,您可以使用简单的for - 循环。
  4. String concatenation vs. string substitution.由于您不想将IP写入生成的文件,但要为其添加其他字符串,您需要以某种方式创建此字符串。有多种方法可以做到这一点,这里提到了两种最常见的方法。
  5. 利用这些知识,你......

    1. 创建输出文件
    2. 写下几行不变的内容
    3. 打开并阅读您的IP列表
    4. 遍历列出的所有IP
    5. 使用字符串替换(或串联)
    6. 为IP生成完整字符串
    7. 也将该字符串写入结果文件
    8. 重复步骤5和6,直到您完成所有IP
    9. 在结果文件的末尾写下几条不变的行
    10. 完成!
    11. 如果这不适合您,请修改您的问题并显示您正在使用的代码。

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

答案 1 :(得分:0)

您要做的是合并两个文件的内容,将file1.txt派生的内容插入file2.txt。我可以从您的示例中看到插入点位于file2.txt的第7行之后,但是,插入点如何确定为file2.txt

如果假设您将始终插入,则可以打开file2.txtfile3.txt,从file2.txt读取7行并将这些行写入file3.txt 。然后,您可以将转换后的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规则很重要。