我正在用PHP构build一个NAS控制应用程序,只能从本地networking访问。
我将从PHP-FPM开始,它不允许用root用户启动它的池,我还没有find强制它的方法。
是的,是的,以root身份运行PHP并不安全(并且还构build了操作系统configuration应用程序),但我没有其他想法,我怎么能够直接从PHP使用file_put_contents()和Arch /etc/rc.conf编辑Arch Linux的/etc/rc.conf rc.d restart network 。
我在php.ini设置了open_basedir = / 。
我已经阅读了这个 ,因此,我build立了一个sudoer,用相应的用户和组启动PHP-FPM池。
我的sudoer是一个系统用户,添加了:
useradd -r -s /bin/bash -g wheel -d /srv/http/ systemphp
在sudoerconfiguration我添加了条目:
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); }
我如何设置这样一个环境,或至less反映它?
请不要构build编辑关键configuration文件的Web界面。
相反,您可以构build一个Web应用程序,让用户修改此configuration文件的副本或模板。 然后,代理程序或日程安排脚本可以实际修改此configuration文件。
这是最可靠的工作方式。 看看puppet或bcfg2 ,看看它是如何在其他语言中完成的。
虽然我强烈地同意这是一个坏主意,事实上,你应该编辑一个临时副本,并有其他的东西复制它,如果你决定直接编辑rc.conf ,创build一个组,使systemphp成员,将rc.conf的组所有权更改为该组,并给予rc.conf组写入权限。
这至less要比给用户NOPASSWD: all通过sudoers的NOPASSWD: all权限潜在的fuckups开放less。
而且,这仍然是一个可怕的想法。 你可能没有办法对系统造成伤害,但要确保这一点非常困难。 我会尽可能说你不能。 rc.conf是一个bash脚本,它是来源,祝你好运,照顾潜在的边缘情况。
另外,我甚至不会想到rc.conf中的任何内容对于像这样的更改都是有用的,尤其是对于最新的系统来说,它是一个非常小的文件 – 基本上任何东西都可能在其他地方更适当的改变,或者在不同的文件中进行更改,并告诉rc.conf发送该文件,如果确实需要在那里存在的话。