【问题标题】:Add lines to file by using array commands with php使用带有 php 的数组命令将行添加到文件
【发布时间】:2016-01-07 16:19:12
【问题描述】:

我正在尝试制作一个将 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

【问题讨论】:

  • 只要确保你只运行这个脚本一次 :)
  • 但是如果我想多次使用它并在# Remote Phones之后添加多个条目呢?
  • 我认为没有问题,只是尝试在您的 IP 表中没有条目的重复项,您的代码看起来很干净 :)

标签: php html arrays file preg-replace


【解决方案1】:

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

【讨论】:

  • 这项工作是多次还是一次工作?换句话说,如果我在# Remote Phones 之后添加XXX.YYY.XXX.YYY,我是否可以在# Remote Phones 之后再次添加其他IP?
  • 是的,这将在您每次使用代码时添加一个新行。请注意,这可能会产生重复。
猜你喜欢
  • 2021-12-28
  • 2021-05-12
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多