无法初始化前端:使用 ssh 时的对话框

twa*_*163 61 ssh remote

我在测试环境中以 root 身份通过 ssh 执行以下命令:

ssh <remote_srv> "apt-get autoremove"
Run Code Online (Sandbox Code Playgroud)

在我的 sshd_config 中,我有“PermitRootLogin without-password”,并且我已将 root 的 id_rsa.pub 添加到远程服务器上的 authorized_keys 文件中。

不过我收到以下错误:

debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
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
Run Code Online (Sandbox Code Playgroud)

我已经在 ssh 的 de 手册页中查找了这一点,但无法理解伪术语和 ttys 的解释。

有没有人可以解释上述错误?我想这是一个缺失的选项,但哪个?

两个平台都是 Ubuntu 14.04 LTS。

小智 74

我相信这与apt-get autoremove在非交互式 shell 中运行的事实有关。请参阅在 docker 下安装时是否可以回答对话框问题?

解决方案似乎是在命令前加上DEBIAN_FRONTEND=noninteractive

ssh <remote_srv> "DEBIAN_FRONTEND=noninteractive apt-get autoremove"
Run Code Online (Sandbox Code Playgroud)

  • 在 docker install 期间使用 apt-get 时会发生这种情况,添加前缀,效果很好 (13认同)

小智 17

亚历克斯的解决方案确实抑制了错误,他几乎找到了正确的原因,但它不允许您回答任何问题(当您预先确定答案并从脚本运行时这很好,但是当您尝试新软件包时真的很烦人)。核心问题是 ssh 和 debconf 的各种前端所做假设之间的交互。

让我们从 ssh 开始。ssh 假定当您不指定远程命令时,您希望在远程端有一个 pty,而您指定了一个不需要的远程命令(这在 90% 的情况下都非常有效,只是不是这个)。这可以被-t强制 pty 的-T选项或不强制 pty 的选项(或相应的配置文件选项)覆盖。此外,当使用 pty 时,TERM环境变量会被复制(例外情况可能适用于检查文档以获取完整的详细信息和官方抽奖活动报名表)。另请注意,该-x选项禁用 X11 转发并-X启用它。

Debconf 本身没有交互性要求(按设计),但各种前端都有,而且每个前端都有不同的要求。

我相信最好看的前端是 gnome(还有一个我没有开始工作的 ked 前端)。gnome 前端(以及 kde 前端)需要一些非默认库和 X11 服务器,因此强制使用 gnome 前端的命令行(一旦安装了适当的库)将是

ssh -X <remote_srv> "DEBIAN_FRONTEND=gnome apt-get autoremove"
Run Code Online (Sandbox Code Playgroud)

或者如果你更喜欢 kde

ssh -X <remote_srv> "DEBIAN_FRONTEND=kde apt-get autoremove"
Run Code Online (Sandbox Code Playgroud)

对话前端(默认)需要一个 pty 和一个终端,该终端具有在 TERM 变量中指定的最低功能级别(实际上,这是具有完整 terminfo 描述的任何内容,除了哑语)。

ssh -t <remote_srv> "TERM=$TERM DEBIAN_FRONTEND=dialog apt-get autoremove"
Run Code Online (Sandbox Code Playgroud)

或者

ssh -t <remote_srv> "apt-get autoremove"
Run Code Online (Sandbox Code Playgroud)

readline 前端的要求不那么严格,可以与哑终端一起使用,但需要一个 pty。

ssh -t <remote_srv> "DEBIAN_FRONTEND=readline apt-get autoremove"
Run Code Online (Sandbox Code Playgroud)

编辑器前端取决于编辑器,而编辑器根据编辑器有特定要求。

ssh -t <remote_srv> "DEBIAN_FRONTEND=editor EDITOR=vi apt-get autoremove"
ssh -X <remote_srv> "DEBIAN_FRONTEND=editor EDITOR=gvim\ -f apt-get autoremove"
Run Code Online (Sandbox Code Playgroud)

非交互式前端没有要求,但它不会提出任何问题(这可能是您想要的,也可能不是)。

ssh <remote_srv> "DEBIAN_FRONTEND=noninteractive apt-get autoremove"
Run Code Online (Sandbox Code Playgroud)