我正在编写一个用于配置 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"); ?>