无法从PHP向TMUX会话发送命令

15 html php linux bash tmux

我有一个运行Minecraft服务器的TMUX会话,我正在为服务器创建一个Web界面.

目前我有以下文件:

command.sh

 #!/bin/bash
 tmux send-keys -t minecraft C-z "$@" Enter
Run Code Online (Sandbox Code Playgroud)

的index.php

<?PHP
    if($_POST) {
        $commandString = $_POST['inputCommand'];
        $output = shell_exec('./command.sh $commandString');
        echo "<pre>$output</pre>";
        }
?>
    <form method="post">
        <input type="text" name="inputCommand" placeholder="Type Command"/>
        <input type="submit" value="Execute" />
    </form>
Run Code Online (Sandbox Code Playgroud)

command.sh在终端中工作,我可以使用所有标准命令

 ./command.sh "/help"
Run Code Online (Sandbox Code Playgroud)

但是我无法使用上述方法从php执行此脚本.我已经将www-data和www-user添加到sudoers并尝试了

shell_exec('sudo ./command.sh $commandString')

但这也没有奏效.

单击提交按钮时,将回显输出,但它是空白的.

有人可以帮忙指出我执行脚本的方法出错了吗?


编辑 我拍了两个截图,一个在前,一个用于进一步澄清.

在此输入图像描述

Erl*_*ton 9

command.sh遇到问题并向stderr输出一些东西.shell_exec只返回stdout,所以你没有看到错误.尝试将"2>&1"附加到命令的末尾,例如

$output = shell_exec('./command.sh $commandString 2>&1');
Run Code Online (Sandbox Code Playgroud)

这会将stderr发送到stdout,让你看看发生了什么.调试问题后,删除"2>&1".正如评论中指出的那样,我想实际的问题是你使用的是单引号,这意味着$ commandString正在按字面解释.请尝试双引号!

警告!!! 这真的很不安全.您将从POST获取的未经过验证的参数传递给以sudoers中的用户身份运行的命令.无论两个登录屏幕如何,您都应该清理输入.

  • 实际上,*写为*,这是非常安全的 - 没有变量替换正在进行.正在执行的命令是一个常量字符串.这可能就是为什么行为不像预期的那样.当然,"修复"它会引入警告的漏洞. (8认同)
  • 我使用了上面提到的将标准错误重定向到标准输出的建议,我发现TMUX找不到字符串,我将其更改为su -c命令并且它有效.我也发现了一个更好的方法,大约10分钟后,这个工作,我的世界有一个内置的Rcon功能,我用它通过PHP帖子形式进行通信.因此,没有shell_exec,所有更安全. (4认同)