2015-04-02 32 views
-2

我的朋友, 使用python 2.7.3 我想在file1.txt手册中写一些ipaddrss,每行一个ip。 如何用python读取file1.txt所有的ipaddress,把它放到file2.txt保存为file3.txt?python控制iptabless使用配置文件

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 
+0

“把它放入file2.txt”是什么意思?这与“另存为file3.txt”有什么不同?你试过什么了?你的第一次尝试是如何解决的?这与你预期的做法有何不同?是什么给了我们印象,我们会为你写代码? – 2015-04-02 02:22:16

+0

对不起我的泳池英语; 1.我把file1.txt放到samba共享文件夹中,我会添加一些ipaddres到它里面; 2. /etc/rc.local添加命令行doit.py; doit.py会将file1 ipaddress列表放入file2.txt(只是一个模板),如file3.txt; 如果我更改file1.txt,我将重新启动系统,并且rc.local调用doit.py从file2.txt生成新的file3.txt – Moses 2015-04-02 14:29:24

回答

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。一些代码来做到这一点是这样的:如果该文件的顺序并不重要,因为你可以只添加新的规则接近文件结尾,COMMIT

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()) 

这个任务将被简化。不过,我认为这个顺序对iptables规则很重要。

+0

THX,脚本工作正常。 – Moses 2015-04-03 01:32:29

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 -loop来实现这一点。
  4. String concatenation vs. string substitution.由于您不想只将IP写入生成的文件,但要添加其他字符串,您需要以某种方式创建该字符串。有很多方法可以做到这一点,这里提到两个最常见的方法。

使用这方面的知识,你...

  1. 创建一个输出文件
  2. 写几行不改变
  3. 打开并阅读您的IP列表
  4. 通过迭代列出的所有IP
  5. 使用字符串替换(或级联)生成IP的完整字符串
  6. 编写串到你的结果文件,也
  7. 重复步骤5和6,直到你与所有IP进行
  8. 写在
  9. 做你的结果文件的末尾几未变化的线!

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

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