我正在编写一些脚本,以便在运行 Debian 10 的服务器上安装一些东西。
这是脚本:
#!/usr/bin/env sh
address=$1
ssh -T $address <<EOF > /dev/null
DEBIAN_FRONTEND=noninteractive
sudo apt-get install --assume-yes docker.io
EOF
当我运行作为参数传入的脚本“[email protected]”时,我得到以下输出:
debconf: unable to initialize frontend: Dialog
debconf: (Dialog frontend will not work on a dumb terminal, an emacs shell buffer, or without a controlling terminal.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (This frontend requires a controlling tty.)
debconf: falling back to frontend: Teletype
dpkg-preconfigure: unable to re-open stdin:
我的理解是,这DEBIAN_FRONTEND=noninteractive
是为了防止出现这些警告。我在这里误解了什么吗?
我也试过将命令放在脚本中并运行脚本而不是命令。然后我尝试不使用这里的文档,但仍然没有运气。
这是发生了什么:
DEBIAN_FRONTEND=noninteractive
在 shell 中定义一个变量。该变量不会导出到环境中。只有当它已经是一个环境变量时,它才会是一个环境变量;很可能不是。sudo
。只有环境变量被继承,所以sudo
不知道你的DEBIAN_FRONTEND
.sudo
产卵apt-get
。即使该工具知道,清理其子环境的环境也是DEBIAN_FRONTEND
正常的,所以无论如何也不知道。sudo
apt-get
DEBIAN_FRONTEND
要处理这个问题,您需要导出变量。而不是
DEBIAN_FRONTEND=noninteractive
你需要发送到远程外壳。然后你需要确保
sudo
不会隐藏它的形式apt-get
。看到这个问题:How to keep environment variables when usingsudo
? 来自其中一个答案:在你的情况下,这里的文件将是这样的:
另一个答案提到了一种指定变量的方法,这些变量应该在没有
-E
:文件的情况下继续env_keep
存在。sudoers
我不会详细说明这一点。还有另一种方法:
sudo
允许您通过将变量放在实际命令之间来定义变量sudo
,尽管这些也受到安全策略施加的限制。即使不导出变量,以下代码片段也应该有效(如果策略允许):注意这里的文件你需要
<<'EOF'
而不是<<EOF
防止变量在本地扩展(或者你需要转义$
)。这变得越来越复杂,好消息是您根本不需要远程 shell 中的变量。在您的情况下,这应该足以为以下定义正确的变量apt-get
:最后,如果安全策略不允许您指定此变量,您可以
sudo
生成另一个 shell:但我预计这种限制性政策会首先阻止您进入
sh
,sudo
因此最后一条命令可能没有实际意义。