通过PHP运行bash命令,更改目录,然后执行二进制文件


Run bash command via PHP, change dir then execute binary

下面是我要做的。我试图通过PHP脚本在另一个用户下启动一个二进制文件。Apache具有sudo访问权限。当通过作为"测试"登录的putty运行时,该命令运行良好。

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

我还可以加上吗

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

由于二进制文件的编写方式,它无法工作(除非你之前cd到文件夹,在终端上测试,否则它不会找到它的资源)

如果每个人都可以访问/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依赖于像cd和B这样的shell功能。不包括动态值,因此最好的方法是简单地调用shell来逐字解释它:

    sh-ccd /home/test/cs && ./hlds_run

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

    sudo-utestsh-ccd /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"');

你试过这个吗?(确保您是否拥有hlds_run的执行权限)

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