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

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

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

ssh <remote_srv> "apt-get autoremove"

在我的 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

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

有人能解释上述错误吗?我猜是缺少了一个选项,但是是哪一个呢?

两个平台都是 Ubuntu 14.04 LTS。

答案1

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

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

ssh <remote_srv> "DEBIAN_FRONTEND=noninteractive apt-get autoremove"

答案2

Alex 的解决方案确实抑制了错误,他几乎找到了正确的原因,但它不允许您回答任何问题(当您预先设定了答案并从脚本运行时,这很好,但当您尝试新的软件包时,这真的很烦人)。核心问题是 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"

或者如果你更喜欢 kde

ssh -X <remote_srv> "DEBIAN_FRONTEND=kde apt-get autoremove"

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

ssh -t <remote_srv> "TERM=$TERM DEBIAN_FRONTEND=dialog apt-get autoremove"

或者

ssh -t <remote_srv> "apt-get autoremove"

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

ssh -t <remote_srv> "DEBIAN_FRONTEND=readline apt-get autoremove"

编辑器前端依赖于编辑器,而编辑器根据编辑器的不同会有特定的要求。

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"

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

ssh <remote_srv> "DEBIAN_FRONTEND=noninteractive apt-get autoremove"

相关内容