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


Add lines to file by using array commands with php

我正在尝试制作一个php脚本,将IP添加到防火墙中。我不完全确定我做错了什么。我试图将$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

这可以通过使用正则表达式查找和替换# 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的内容。