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

问题

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

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

my_package没有正确安装,但是SSH会话只是悬而未决。

有没有任何标志可以通过SSH获取apt-get工作?


附加信息

上下文

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

已经试过&笔记

  • 执行apt-get update SSH会话完全closures。 请注意, apt-get update不是交互式的,而apt-get install是。 这可能表明交互性是一个问题。
  • 一个类似于ssh user@target "sudo apt-get install my_package && echo Hello"永远不会到达echo
  • debconf抱怨说找不到一个不错的前端(Display,Readline),并且回退到Teletype(尽pipeReadline可用)。
  • 关于debconf的前端,通过-t强制使用SSH的TTY不会有帮助。 DEBIAN_FRONTEND=noninteractive
  • 所有这些都是在Ubuntu 12_04 LTS上完成的。

关于SF的下面的答案做了诀窍:

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

-t标志强制执行一个伪tty分配,除了在本地没有TTY时。 但是像-t -t这样两次通过国旗就是假装这样做的。 这解决了这个问题。

请参阅SSH文档:

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

那么为什么这样做呢? 事实certificate, debconf不会再抱怨日志中的前端。 所以我相信,根据需要,使用双-t (lures?) debconf ,它允许apt-get install完成,干净地结束SSH会话。

当我看透它时,这可能会完成这项工作。 调用任何命令应该跟随退出和heredoc。 find解决scheme,但没有亲自尝试过。

 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

在debian / jessie下,我用这个命令成功了:

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

但也许你应该考虑使用这个和其他upcomming任务http://docs.ansible.com/ansible/apt_module.html