执行HTML中的bash代码以运行docker命令



我有一个类似这样的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

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

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

由于您使用"sudo";您还需要使用sudo通过shell_exec()执行该命令。

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

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

/off由于这不是一个编程问题,您可能会更幸运地接近服务器故障中的人员

首先,您需要允许(可能是www数据用户(在没有密码的情况下使用sudo。你可以通过sudoers做到这一点:

vim /etc/sudoers

添加行:

<user> ALL=(ALL) NOPASSWD: /path/to/your/script.sh

然后你的shell_exec应该是这样的:

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

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

我还建议使用";预";

<pre><?php echo $output; ?></pre>

祝你好运!

在我的案例中,错误与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进行排序解决了我的问题。希望这能帮助有同样问题的人。

最新更新