问题

问题

问题

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

ssh user@target "sudo apt-get -y install my_package"

确实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 的前端,-t通过 SSH 强制 TTY 没有帮助。也没有DEBIAN_FRONTEND=noninteractive
  • 所有操作均在 Ubuntu 12_04 LTS 上完成。

答案1

SF 上的以下答案起到了作用:

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

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

请参阅 SSH 文档:

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

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

答案2

我仔细查看了一下,这个可能可以解决问题。调用任何命令后都应该跟上 exit 和 heredoc。找到了解决方案,但还没有亲自尝试过。

ssh user@myremotemachine <<-EOF
free -m
exit
EOF

原始答案来自这里:http://www.thetechrepo.com/main-articles/529-execute-a-command-remotely-over-ssh-and-then-close-the-connection

答案3

在 debian/jessie 下我成功执行了以下命令:

ssh user@host "TERM=READLINE sudo apt-get install --reinstall less && echo done"

但也许你应该考虑使用 ansible 来完成这项任务和其他即将完成的任务http://docs.ansible.com/ansible/apt_module.html

相关内容