运行 bash 命令通过 PHP,更改目录然后执行二进制文件
Run bash command via PHP, change dir then execute binary
这就是我正在尝试做的事情。我正在尝试通过 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 到之前的文件夹,在终端上测试)
你试过这个吗? (确保您是否拥有 hlds_run 的执行权限)
passthru('bash -c "sudo -u test && /home/test/cs/hlds_run"');
如果每个人都可以访问/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
与 execve
语义(分别由 passthru
和 sudo
使用)。
这是经过测试的 shell 字符串,我们需要 运行 作为特定用户:
cd /home/test/cs && ./hlds_run
我们可以确保它总是运行作为具有sudo
的特定用户,但是sudo
使用execve语义。我们必须将 shell 字符串转换为 execve
数组,并且由于此命令 A. 依赖于 shell 功能,如 cd
和 B. 不包括动态值,因此最好的方法是简单地调用一个 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"');
这就是我正在尝试做的事情。我正在尝试通过 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 到之前的文件夹,在终端上测试)
你试过这个吗? (确保您是否拥有 hlds_run 的执行权限)
passthru('bash -c "sudo -u test && /home/test/cs/hlds_run"');
如果每个人都可以访问/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
与 execve
语义(分别由 passthru
和 sudo
使用)。
这是经过测试的 shell 字符串,我们需要 运行 作为特定用户:
cd /home/test/cs && ./hlds_run
我们可以确保它总是运行作为具有
sudo
的特定用户,但是sudo
使用execve语义。我们必须将 shell 字符串转换为execve
数组,并且由于此命令 A. 依赖于 shell 功能,如cd
和 B. 不包括动态值,因此最好的方法是简单地调用一个 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"');