我有一个这样的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都是新手。如果有人能给我给予建议,我将非常感激。
3条答案
按热度按时间bpzcxfmw1#
在我的例子中,错误与
sudo
无关。字符串
注意,当执行过程中出现错误,或者进程没有产生输出时,
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
解决了我的问题。pgx2nnw82#
因为你是用“sudo”执行docker,所以你也需要用sudo通过
shell_exec()
执行命令。此外,如果您的服务器环境使用chroot,则运行PHP进程的用户甚至可能无法使用docker二进制文件。
我建议您与系统管理员联系。
pkwftd7m3#
首先,你需要允许(可能是www-data用户)在没有密码的情况下使用sudo。你可以通过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”打印输出
<pre><?php echo $output; ?></pre>
个