【问题标题】:Execute bash code from HTML to running docker command从 HTML 执行 bash 代码以运行 docker 命令
【发布时间】:2020-11-10 22:40:07
【问题描述】:

我有一个这样的 bash 代码:

sudo docker exec -it container_id /bin/bash -c 'cp test1.txt test2.txt'
rm test3.txt

它在终端中运行良好。但我想从 html 中调用它。我的html代码是:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>run bash</title>
</head>
<body>
<?php
 if(isset($_POST['submit']))
 {
   $output=shell_exec('sh /Users/path/script.sh');
}
?>
<p><?php echo $output; ?></p>
</body>

基本上,我想点击“提交”按钮(我放在上面的php代码将被另一个html文件调用),它将执行bash代码登录docker并运行命令cp test1.txt test2.txt

但它只删除了 test3.txt,而当我从 html 运行它时它没有复制 docker 上的文件。另外,我没有从网站获得任何输出。这很奇怪,因为它可以通过 sh /Users/path/script.sh 在终端运行。

我对 html 和 docker 都是新手。如果有人能给我建议,将不胜感激。

【问题讨论】:

  • 从您的帖子中,我不清楚script.sh 的内容到底是什么。是您在问题之上写的两行(sudorm)吗?除了 Dave 给出的评论之外,请注意以您的方式运行命令,script.sh 不会由 bash 执行。在您的简单情况下可能无关紧要,但如果您将特定于 bash 的功能放入脚本中,这可能很重要。
  • 是的 script.sh 是两行(sudo 和 rm)。对不起,我没有说清楚。
  • 我强烈建议想出一种不同的方式来调用这个任务。使用docker 命令来root 整个主机非常容易;如果您不习惯 Docker CLI 或以这种方式调用 shell 命令,很容易意外引入重大安全漏洞。
  • @yuhangchen:如果复制不起作用,您至少应该收到一条错误消息。我建议使用 bash -cx 'cp -v .....' 运行复制并从 shell_exec 中捕获 stdout stderr 并将结果显示在 HTML 页面上以进行调试。
  • @user1934428:我收到错误“输入设备不是 TTY”。

标签: php html bash docker shell


【解决方案1】:

由于您使用“sudo”执行 docker,因此您还需要使用 sudo 通过shell_exec() 执行命令。

此外,如果您的服务器环境使用 chroot,则运行 PHP 进程的用户甚至可能无法使用 docker 二进制文件。

我建议与您的系统管理员联系。

/off 由于这不是一个编程问题,你可能会更幸运地与Server Fault 中的人联系

【讨论】:

  • 感谢您的 cmets。我在终端尝试过,没有'sudo'它仍然可以工作。而且我听说使用 shell_exec 以 root 身份执行命令并不安全。顺便说一句,我不知道 chroot 是什么意思。我只是在 localhost 上使用 mac 完成此操作。
【解决方案2】:

首先,您需要允许(可能是 www-data 用户)在这个脚本中使用没有密码的 sudo。 您可以通过 sudoers 执行此操作:

vim /etc/sudoers

添加行:

&lt;user&gt; ALL=(ALL) NOPASSWD: /path/to/your/script.sh

那么你的 shell_exec 应该是这样的:

$output=shell_exec('/usr/bin/sudo /path/to/your/script.sh');

但要小心,只有在知道自己在做什么的情况下才使用 sudo ;)

我还建议使用“pre”打印输出

&lt;pre&gt;&lt;?php echo $output; ?&gt;&lt;/pre&gt;

祝你好运!

【讨论】:

  • 感谢您的建议。我听从了你的建议,但它仍然无法在 html 中工作。
  • 我收到错误“输入设备不是 TTY”。我想我的问题不是由 sudo 引起的。
  • 所以试试不带“-t”
【解决方案3】:

就我而言,错误与sudo 无关。 为了获得标准输出,我运行了这个

<pre><?php echo exec('sh /path/to/my/script/script.sh 2>&1', $output, $return_var); ?></pre>
<pre><?php print_r($output); ?></pre>
<pre><?php echo $return_var; ?></pre>

注意,当执行过程中发生错误,或者进程没有产生输出时,shell_exec() 将返回 NULL。因此,使用函数shell_exec()无法通过返回值检测进程是否成功执行。如果需要查看进程执行的退出代码,请改用exec()函数。

它输出了the input device is not a TTY

在我的 bash 脚本中,我将 sudo docker exec -it container_id /bin/bash -c 'cp test1.txt test2.txt' 更改为 docker exec -i container_id /bin/bash -c 'cp test1.txt test2.txt'

基本上,运行 docker exec -i 而不是 docker exec -it 解决了我的问题。希望这能帮助遇到同样问题的人。

【讨论】:

    猜你喜欢
    • 2017-07-10
    • 2019-08-04
    • 2010-11-18
    • 2012-07-08
    • 2010-10-29
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多