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

Posted

技术标签:

【中文标题】通过 PHP 运行 bash 命令,更改目录然后执行二进制【英文标题】:Run bash command via PHP, change dir then execute binary 【发布时间】:2015-05-18 22:54:52 【问题描述】:

这就是我想要做的。我正在尝试通过 php 脚本在另一个用户下启动二进制文件。 Apache 具有 sudo 访问权限。该命令在以“test”身份通过 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 到该文件夹​​,在终端上测试,否则它不会找到它的资源)

【问题讨论】:

你需要将命令引用到sudo 或者外壳看到; 并先拆分命令。 @EtanReisner 喜欢这个? passthru('bash -c "sudo -u test "cd /home/test/cs/ ; ./hlds_run" " '); ?我需要逃避什么吗? 是的,就像那样。是的,您需要从外壳中转义内部双引号,是的。 passthru('bash -c "sudo -u test \"cd /home/test/cs/ ; ./hlds_run\" "');没有骰子,它不会开始。编辑:: 我刚刚意识到 php 可能会逃脱第一个 \ 所以我尝试 passthru('bash -c "sudo -u test \\"cd /home/test/cs/ ; ./hlds_run\\" "');但还是不行 请更具体地定义“no dice”和“nope”。这有什么问题? 【参考方案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"');

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

    这是我们需要以特定用户身份运行的经过测试的 shell 字符串:

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

    我们可以确保它始终以 sudo 的特定用户身份运行,但 sudo 使用 execve 语义。我们必须将我们的 shell 字符串转换为 execve 数组,并且由于此命令 A. 依赖于 cd 等 shell 功能,而 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"');

【讨论】:

欢呼玛丽第二个作品。你能解释一下这个命令的每一点,只是为了学习而不是让别人为我做吗?【参考方案2】:

你试过吗? (确保你有 hlds_run 的 exec 权限)

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

【讨论】:

OP 中提到不能直接这样运行脚本,在 sudo 用户下运行脚本失败。 程序无法运行,除非您之前使用“cd”,然后在主文件夹中运行它。 sudo -u test cmd 不是通过用户测试执行 cmd 吗?我不确定它是如何工作的,但几乎没有关于它的文档...... 如果能把环境路径加到/home/test/cs/就更好了。所以你可以直接调用hlds_run而不用cd到主文件夹。 这里的cd 不是为了找到二进制文件。二进制文件可以找到它的数据/等。文件听起来像。所以$PATH(假设这就是你的意思)在这里不相关。 也许我解释错了。我的意思是,例如,如果您登录用户并 cd .. 一直到 root,然后 ./home/test/cs/hlds_run 它将启动该过程,但它会开始喷出未找到的错误成分。如果你 cd .. 一直到 root 然后 cd /home/test/cs/ ; ./hlds_run 它工作正常。

以上是关于通过 PHP 运行 bash 命令,更改目录然后执行二进制的主要内容,如果未能解决你的问题,请参考以下文章

bash光标在搜索命令行中移动

Linux后台运行Python程序

sh 暂时更改bash中的当前工作目录以运行命令 - 来自http://stackoverflow.com/questions/10382141/temporarily-change-

Mac / OSx - 更改在 bash 中调用的 PHP 版本

常用命令行快捷键

如何正确设置 PHP 环境变量以在 Git Bash 中运行命令