运行 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"');

要进行第二次调用,您应该已经熟悉 systemexecve 语义(分别由 passthrusudo 使用)。

  1. 这是经过测试的 shell 字符串,我们需要 运行 作为特定用户:

    cd /home/test/cs && ./hlds_run

  2. 我们可以确保它总是运行作为具有sudo的特定用户,但是sudo使用execve语义。我们必须将 shell 字符串转换为 execve 数组,并且由于此命令 A. 依赖于 shell 功能,如 cd 和 B. 不包括动态值,因此最好的方法是简单地调用一个 shell 来逐字解释它:

    { sh, -c, cd /home/test/cs && ./hlds_run }

  3. 我们现在可以将 sudo 应用到 运行 作为我们的特定用户:

    { sudo, -u, test, sh, -c, cd /home/test/cs && ./hlds_run }

  4. passthru 运行作为shell,所以现在我们必须将上面的execve数组转换回shell 字符串,特别注意引用以确保 shell 将其解析为上面的确切参数列表。幸运的是,这是一个相对简单的案例:

    sudo -u test sh -c "cd /home/test/cs && ./hlds_run"

  5. 我们现在可以把它交给passthru:

    passthru('sudo -u test sh -c "cd /home/test/cs && ./hlds_run"');