如何运行 sed 来替换文件中的行或在 PHP 中执行类似的操作?

如何运行 sed 来替换文件中的行或在 PHP 中执行类似的操作?

我正在编写一个用于配置 OpenWRT 的 Web 前端。我正在使用 PHP 执行命令,并且所有 uci 命令都可以正常执行。但是,OpenVPN 配置无法通过 UCI 完成,我必须在其配置文件上使用直接的 Unix 命令。

这些命令在我的终端中运行良好,但在 PHP 中则不然:

shell_exec(" cd /etc/openvpn && sed -i '2s/.*/remote 5-nl.cg-dialup.net 443/' openvpn.ovpn && cd'");
shell_exec(" cd /etc/openvpn && sed -i '30s/.*/ca /etc/openvpn/Nethelands/ca.crt/' openvpn.ovpn && cd'");
shell_exec(" cd /etc/openvpn && sed -i '32s/.*/cert /etc/openvpn/Nethelands/client.crt/' openvpn.ovpn && cd'");
shell_exec(" cd /etc/openvpn && sed -i '34s/.*/key /etc/openvpn/Nethelands/client.key/' openvpn.ovpn && cd'");

如何用 PHP 完成上述任务?我是否需要编写 shell 脚本,或者是否需要更改 uhttpd 权限?

我在 Openwrt Chaos 平静的 uhttpd Web 服务器上运行 php。与树莓派2

答案1

快速粗略的猜测:

  • 没有权限。/etc普通用户通常无法更改其中的文件,尤其是像 httpd 这样的 Web 用户。跑去chmod -R +w /etc/openvpn为此打开一个洞,或者做点什么chown
  • sed命令无效。在命令 2-4 中,出现了多个斜杠。由于s后面跟着一个斜杠,因此斜杠用作操作数分隔符,并且sed不适用于如此多的无效操作数。将您的 sed 内容更改为:

    <?php /* For Syntax */ // cd avoided.
    shell_exec("sed -i.php_sed_bak ".
        "-e '2s@.*@remote 5-nl.cg-dialup.net 443@' ".
        "-e '30s@.*@ca /etc/openvpn/Nethelands/ca.crt@' ".
        "-e '32s@.*@cert /etc/openvpn/Nethelands/client.crt@' ".
        "-e '34s@.*@key /etc/openvpn/Nethelands/client.key@' ".
        "/etc/openvpn/openvpn.ovpn"); ?>
    

相关内容