所以这就是我想要做的事情。我试图通过PHP脚本在另一个用户下启动二进制文件。 Apache有sudo访问权限。当通过putty以" test"。
登录时,该命令工作正常passthru('bash -c "sudo -u test cd /home/test/cs/ ; ./hlds_run"');
我也可以添加
passthru('bash -c "sudo -u test ./home/test/cs/hlds_run"');
由于二进制文件的编写方式而无法工作(除非你之前cd到文件夹,在终端上测试,否则它不会找到它的资源)
答案 0 :(得分:1)
如果每个人都可以访问/home/test/cs
:
passthru('cd /home/test/cs && sudo -u test ./hlds_run');
如果只有用户test
可以访问该目录:
passhtru('sudo -u test sh -c "cd /home/test/cs && ./hlds_run"');
要进行第二次调用,您应该已经熟悉system
vs execve
语义(分别由passthru
和sudo
使用)。
这是我们需要以特定用户身份运行的测试shell字符串:
cd /home/test/cs && ./hlds_run
我们可以确保它始终以sudo
作为特定用户运行,但sudo
使用execve语义。我们必须将我们的shell字符串转换为execve
数组,并且由于此命令A.依赖于cd
和B.之类的shell功能,因此不包含动态值,最好的方法是简单地调用shell来逐字解释:
{sh
,-c
,cd /home/test/cs && ./hlds_run
}
我们现在可以将sudo
应用为我们的特定用户:
{sudo
,-u
,test
,sh
,-c
,cd /home/test/cs && ./hlds_run
}
passthru
作为shell运行,所以现在我们必须将上面的execve
数组转换回shell字符串,特别注意引用以确保shell将其解析为上面的确切参数列表。幸运的是,这是一个相对简单的案例:
sudo -u test sh -c "cd /home/test/cs && ./hlds_run"
我们现在可以将其提交给passthru
:
passthru('sudo -u test sh -c "cd /home/test/cs && ./hlds_run"');
答案 1 :(得分:0)
passthru('bash -c "sudo -u test && /home/test/cs/hlds_run"');