2015-04-02 60 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. 做你的結果文件的末尾幾未變化的線!

如果這不起作用,請編輯您的問題並顯示您正在使用的代碼。

當然,可以真正使用兩個輸入文件來生成輸出,但這是更多的編碼要做,也許它不是真的需要。如果你堅持這樣做,試試我先提到的 - 你可以隨時擴展你的腳本。