2016-01-07 76 views
1

我試圖做一個向腳本添加IP的php腳本。我不完全確定我做錯了什麼。我試圖將$ip插入iptables上的第12行數據,然後將其寫入iptables2。還有另一種方法我應該這樣做還是這是最簡單的方法?通過使用php的數組命令添加行到文件

<?php 
//Firewall string 
$ip = "-A INPUT -s " . $_SERVER['SERVER_ADDR'] . " -j ACCEPT" . "\n"; 

//Turn file into array 
$file = file('iptables'); 

//Insert string into array 
$res = array_splice($file, 12, 0, $ip); 

//Write to another file 
file_put_contents("iptables2", $res); 

//Display new file 
$iptables2 = file("iptables2"); 
echo "<ul>"; 
foreach($iptables2 as $s => $r) { 
    echo "<li>" . $s . "=>" . $r . "</li>"; 
} 
echo "</ul>"; 

?> 

iptables看起來是這樣的:

*filter 
-A INPUT -i lo -j ACCEPT 
-A INPUT -m state --state ESTABLISHED -j ACCEPT 
-A INPUT -p udp --match multiport --dports 10000:20000 -j ACCEPT 
# Port 5060 
-A INPUT -s XXX.XXX.XXX.XXX -j ACCEPT 
-A INPUT -s XXX.XXX.XXX.XXX -j ACCEPT 
-A INPUT -s XXX.XXX.XXX.XXX -j ACCEPT 
# Remote Operators 
-A INPUT -s XXX.XXX.XXX.XXX -j ACCEPT 
-A INPUT -s XXX.XXX.XXX.XXX -j ACCEPT 
# Remote Phones 
-A INPUT -s XXX.XXX.XXX.XXX -j ACCEPT 
-A INPUT -s XXX.XXX.XXX.XXX -j ACCEPT 
-A INPUT -s XXX.XXX.XXX.XXX -j ACCEPT 
# Port 3306 - Mysql from Known Sources 
-A INPUT -p tcp -m tcp -s 127.0.0.1 --dport 3306 -j ACCEPT 
# Reject The Rest 
-A INPUT -p tcp -m tcp -j REJECT --reject-with tcp-reset 
-A INPUT -p udp -m udp -j REJECT 
COMMIT 

線12 # Remote Phones,我想-A INPUT -s XXX.XXX.XXX.XXX -j ACCEPT線12

+0

只是確保你只運行這個腳本一次:) –

+0

但是如果我想多次使用它並在'#Remote Phones'之後添加多個條目呢? – lhoward96

+0

我認爲沒有問題,只是不要在你的IP表中有條目的重複項,你的代碼看起來很乾淨:) –

回答

0

這可以通過使用正則表達式查找和完成後插入替換# Remote Operators。所以你不必知道字符串出現的位置。

$ipTables= '*filter 
-A INPUT -i lo -j ACCEPT 
-A INPUT -m state --state ESTABLISHED -j ACCEPT 
-A INPUT -p udp --match multiport --dports 10000:20000 -j ACCEPT 
# Port 5060 
-A INPUT -s XXX.XXX.XXX.XXX -j ACCEPT 
-A INPUT -s XXX.XXX.XXX.XXX -j ACCEPT 
-A INPUT -s XXX.XXX.XXX.XXX -j ACCEPT 
# Remote Operators 
-A INPUT -s XXX.XXX.XXX.XXX -j ACCEPT 
-A INPUT -s XXX.XXX.XXX.XXX -j ACCEPT 
# Remote Phones 
-A INPUT -s XXX.XXX.XXX.XXX -j ACCEPT 
-A INPUT -s XXX.XXX.XXX.XXX -j ACCEPT 
-A INPUT -s XXX.XXX.XXX.XXX -j ACCEPT 
# Port 3306 - Mysql from Known Sources 
-A INPUT -p tcp -m tcp -s 127.0.0.1 --dport 3306 -j ACCEPT 
# Reject The Rest 
-A INPUT -p tcp -m tcp -j REJECT --reject-with tcp-reset 
-A INPUT -p udp -m udp -j REJECT 
COMMIT'; 

$search = '# Remote Operators'; 
$ip = '-A INPUT -s YYY.YYY.YYY.YYY -j ACCEPT'; 

echo preg_replace('/^' . $search . '.*/m', "$search\n$ip", $ipTables); 

您可以在http://sandbox.onlinephpfunctions.com/code/3a0d6dddd228ef79d441b015a58f210d054cf04e

在你的情況看活生生的例子,你會從文件中讀取的$ipTables內容。

+0

這個工作可以多次使用,或者這個工作一次嗎?換句話說,如果我在'#Remote Phones'之後添加'XXX.YYY.XXX.YYY',我可以在'#Remote Phones'之後再添加更多的IP嗎? – lhoward96

+0

是的,每次使用代碼時都會添加一行。請注意,這可能會產生重複。 – maxhb

相關問題