我正在用 PHP 构建一个 NAS 控制应用程序,该应用程序只能从本地网络访问。
首先,PHP-FPM 不允许使用用户启动它的池root
,而且我还没有找到强制执行此操作的方法。
是的,是的,以 root 身份运行 PHP 并不安全(并且还构建了操作系统配置应用程序),但我不知道如何使用并在执行后/etc/rc.conf
直接从 PHP编辑 Arch Linux 。file_put_contents()
rc.d restart network
我 已open_basedir = /
入php.ini
.
我有读这个因此,我设置了一个 sudoer,并使用相应的用户和组启动 PHP-FPM 池。
我的sudoer是系统用户,添加了:
useradd -r -s /bin/bash -g wheel -d /srv/http/ systemphp
在 sudoer 配置中我添加了以下条目:
systemphp stone=NOPASSWD: ALL
stone
是系统的实际主机名。
问题在于我必须这样做sudo <everything>
,但我不想将一切都基于shell_exec()
/ exec()
。
因为这里的任何选择都是一种选择,所以我仍然尝试过:
var_dump(shell_exec('sudo fdisk -l'));
返回了null
。在PuTTY中su systemphp
,sudo fdisk -l
返回了实际列表。
如果没有shell_exec()
,则以下代码会导致fopen(/etc/rc.conf): failed to open stream: Permission denied
:
$handle = fopen('/etc/rc.conf', 'r+');
if ( $handle )
{
while( ($buffer = fgets($handle)) !== false)
{
echo $buffer;
}
if ( !feof($handle) )
{
echo 'Error: fgets() unexpectedly failed' . PHP_EOF;
}
fclose($handle);
}
我该如何建立这样的环境或者至少反映它?
答案1
答案2
虽然我非常同意这是一个坏主意,而且你实际上应该编辑一个临时副本并让其他东西复制它,但如果你决心rc.conf
直接编辑,请创建一个组,让其成为systemphp
成员,将组所有权更改rc.conf
为该组并授予rc.conf
组写权限。
NOPASSWD: all
与通过 sudoers授予用户权限相比,这至少可以减少出现潜在错误的可能性。
此外,这仍然是一个糟糕的想法。您可能看不到对系统造成损害的方法,但要确保这一点将非常困难。我甚至可以说您做不到。rc.conf
是一个 bash 脚本,它有来源,祝您好运处理潜在的边缘情况。
顺便说一句,我甚至想不出其中有什么rc.conf
有用的改变,特别是因为它在最新的系统上是一个非常小的文件——基本上任何东西都可能更适合在其他地方改变,或者在另一个文件中改变,并告诉rc.conf
源该文件,如果它确实实际上需要出现在那儿。