使用带有php的数组命令将行添加到文件中

时间:2016-01-07 16:19:12

标签: php html arrays file preg-replace

我正在尝试创建一个将IP添加到防火墙的PHP脚本。我不完全确定我做错了什么。我正在尝试将$ip插入iptables数据的第12行,然后将其写入iptables2。还有其他方法我应该这样做或者这是最简单的吗?

<?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,我希望在第12行之后插入-A INPUT -s XXX.XXX.XXX.XXX -j ACCEPT

1 个答案:

答案 0 :(得分: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的内容。