通过 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"');
要进行第二次调用,您应该已经熟悉 system
与 execve
语义(分别由 passthru
和 sudo
使用)。
这是我们需要以特定用户身份运行的经过测试的 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 命令,更改目录然后执行二进制的主要内容,如果未能解决你的问题,请参考以下文章
sh 暂时更改bash中的当前工作目录以运行命令 - 来自http://stackoverflow.com/questions/10382141/temporarily-change-