【问题标题】:php to call a shell scriptphp调用shell脚本
【发布时间】:2023-12-20 21:27:02
【问题描述】:

目的:使用php直接将命令输入到我的世界服务器控制台

我正在尝试使用 php 脚本(从浏览器运行)来 exec() 一个 shell 脚本。当我从终端运行 php 时,它可以工作!但是在浏览器中,什么都没有发生。

exec('sudo -u root sh /home/minecraft/whitelist-reload.sh', $out, $ret_val);

从终端运行时,我得到一个“数组 0”,但浏览器给了我一个“数组 1”

有什么问题? 一旦我运行了 shell,之后的一切难道不应该像你在终端上一样工作吗?(shell 脚本里面有什么重要吗?)

shell 拥有所有 rx 权限,并且在 sudoers 文件中为

www-data ALL = NOPASSWD: /home/minecraft/whitelist-reload.sh

【问题讨论】:

  • 使/home/minecraft/whitelist-reload.sh 可执行并尝试'sudo -u root /home/minecraft/whitelist-reload.sh'
  • 使用 shell_exec() 代替测试目的。它不会给你命令的返回值,而是它的输出,所以你可以看到出了什么问题。

标签: php shell sudo minecraft


【解决方案1】:

问题是,您在终端上以可能具有sudo 权限的用户身份运行脚本,而 apache/webserver 用户没有,所以$ret_val(实际上只是一个状态代码) 设置为 1(表示错误)。

在这两种情况下都尝试var_dump($out); 以查看 exec 调用的结果。要从浏览器中执行此类操作,您可能需要查看proc_open 和家人,或者拥有一个修改为 777 的脚本,这样 apache 用户也可以运行它。然后让该脚本调用实际的 shell 脚本并返回它的输出。然而,这是非常危险的,并且应该只用于在您自己的机器上测试环境。永远不要在生产环境中这样做!

我在这里也发布了几个问题,这可能会提供有用的信息:

interaction over ssh

opening a second shell, and load profile variables AND call another script

【讨论】:

    【解决方案2】:

    原来...在将 www-data 输入到 sudoers 文件后,我需要做的就是在它后面加上“-u root”

    【讨论】: