执行“apt-get install”时SSH会话永远不会关闭

Eri*_*ton 14 ubuntu debian ssh apt

问题

apt-get install在非交互式 SSH 会话中运行时,该会话永远不会关闭。例子:

ssh user@target "sudo apt-get -y install my_package"
Run Code Online (Sandbox Code Playgroud)

my_package没有得到正确安装,但SSH会话刚悬开放。

是否有任何标志可以通过 SSH 开始apt-get工作?


附加信息

语境

远程安装用于在集成服务器上自动部署包。一旦我们将一些代码更改推送到存储库,作业就会拉入代码、构建包并在集成中部署它以检查一切是否正常(就部署而言)。

已经尝试过和笔记

  • 执行的相同 SSH 会话apt-get update干净利落地关闭。请注意,这apt-get update不是交互式的,而是apt-get install。这可能表明交互性是一个问题。
  • ssh user@target "sudo apt-get install my_package && echo Hello"永远不会到达的命令echo
  • debconf 抱怨它找不到一个好的前端(Display、Readline),它回退到 Teletype(虽然 Readline 可用)。
  • 关于 debconf 的前端,通过-tSSH传递强制 TTY 没有帮助。都没有DEBIAN_FRONTEND=noninteractive
  • 一切都是在 Ubuntu 12_04 LTS 上完成的。

Eri*_*ton 6

SF 上的以下答案解决了问题:

从 cron bash 脚本运行时,ssh 无法执行远程命令

-t标志强制进行伪 tty 分配,除非本地没有 TTY。但是两次传递标志-t -t只是假装这样做。这解决了问题。

请参阅 SSH 文档:

-t 强制伪 tty 分配。这可用于在远程机器上执行任意基于屏幕的程序,这非常有用,例如在实现菜单服务时。多个 -t 选项强制 tty 分配,即使 ssh 没有本地 tty。

现在,为什么这样做?事实证明,debconf它不再抱怨日志中的前端。所以我相信根据需要进行双重-t设置(诱饵?)debconf,这允许apt-get install完成干净地结束 SSH 会话。