我有一个PHP脚本被HTTP调用,而不是命令行脚本。 该脚本应该以当前webserver用户www-data的其他用户身份调用shell命令。
例:
<?php echo shell_exec('sudo -u myusername -S /usr/bin/whoami'); // returns nothing :( echo shell_exec('whoami'); // returns www-data
当直接在命令行上调用这2个命令sudo -u myusername -S /usr/bin/whoami和whoami时,它们会返回
myusername www-data
对此也没有结果:
<?php echo shell_exec('echo "mypass" | sudo -u myusername -S /usr/bin/whoami');
对我来说,似乎sudo不能和PHP shell_exec()一起工作。
首先,我不明白你正在运行的sudo命令。 sudo -u username应该允许你以user 2的身份,以用户2的身份sudo一个命令,通过说出(在本例中为用户1来运行命令ls):
sudo -u usertwo ls
如果您试图通过用真实用户名replaceusername来清理上面的命令,我很抱歉,但是我不能确定您已经完成了,所以我需要首先提出这一点。
其次,必须将sudoconfiguration为让用户以另一个用户的身份执行一系列命令。 让我们开始让www数据以用户fribble的formssudo ls命令; 你可以通过把这个testing
www-data ALL = (fribble) NOPASSWD: ls
在你的sudoers文件(用一个真实的用户代替fribble)。 然后尝试从你的PHP脚本中,例如, ls -la /tmp ,看看你是否得到一个目录列表。
我同意詹姆斯·劳瑞(James Lawrie)的意见,允许www-data用户以任意用户的身份匿名执行任意命令并不是一个好主意,但是如果你澄清了你试图让www-数据运行的命令,这可能是一个明智的方法来做到这一点。
编辑:
你已经用sudoers文件中的sudo -u user2 ls -al /tmp和PHP脚本中的sudo -u user2 ls -al /tmp进行了尝试,并且你得到了一个目录列表,这强烈build议sudo在PHP中正常工作。
可以肯定的,你可以在sudoers文件中允许/bin/touch ,把sudo -u user2 touch /tmp/TESTFILE放到PHP脚本中,然后执行? 如果user2拥有文件/tmp/TESTFILE ,我们可以肯定sudo和PHP可以正常工作。
我必须承认,如果我知道你试图sudo java,我就不会回答原来的问题,因为我认为java是一个巨大的不可预知的垃圾袋,如果它没有得到它需要的环境(和sudo相当严格的卫生环境)。 但至less上面的testing应该可以帮助你确定,不pipe这里的问题是什么,PHP 不是问题,sudo不能很好地结合在一起。
不要让networking服务器用户sudo访问,你只是要求麻烦。 看看setuid位,而不是:
chmod u+s some_file_that_needs_executing_as_another_user.pl
无论何时执行该文件,将由创build该文件的用户有效执行。
在一个侧面说明,我敢肯定你不能pipe道密码到sudo或passwd。
如果您想对以www-data用户身份运行的Web服务器进程给予特殊权限,则可以执行以下操作之一:
1-将www-data添加到sudoers文件,以便它可以在不询问密码的情况下执行所需的命令/脚本。
2-启用suexec apache模块。 这使您可以将用户从www-data更改为每个虚拟主机的其他特权用户。 所以,你不需要改变整个服务器的用户。