2016-01-07 37 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

相关问题