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


14

问题

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

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 抱怨它找不到合适的前端(显示,阅读线),并且退回到电传打字机(尽管可以使用阅读线)。
  • 关于debconf的前端,通过-tSSH强制强制TTY并没有帮助。都没有DEBIAN_FRONTEND=noninteractive
  • 所有操作均在Ubuntu 12_04 LTS上完成。

如果您手动执行安装命令(即ssh user@target从外壳执行的命令),它是否可以正常工作?
环Ø

手动完成后,install命令运行良好(因此认为非登录/交互式会话类型存在问题)。
埃里克·普拉顿

Answers:


6

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

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

-t标志强制进行伪tty分配,除非本地没有TTY。但是像-t -t假装。这就解决了问题。

请参阅SSH文档:

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

现在,为什么这样做呢?事实证明,debconf不再抱怨日志中的前端。因此,我相信可以根据需要-t设置双精度字符(lures?)debconf,这样就可以apt-get install完全结束SSH会话。


我相信这是一个很好的答案,但我不会立即将其标记为原样。首先是因为我回答了自己,其次,可能会有更好/更通用的答案。以后再说吧。
埃里克·普拉顿

1

当我浏览它时,这可能会完成工作。调用任何命令后都应先退出和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


谢谢你,koressak。我猜这取决于外壳和OS发行版。我刚刚ssh user@host free -m在目标环境中尝试过,它的工作原理就像是一种魅力。我接下来将尝试该建议。
埃里克·普拉顿

我刚刚尝试过使用Heredoc方法进行完整运行。那没有解决问题。SSH会话的挂起方式与问题中提出的方式相同。再次感谢您的答复和指示!
埃里克·普拉顿

1

在debian / jessie下,我成功使用了以下命令:

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

但是也许您应该考虑将ansible用于此任务和其他即将执行的任务http://docs.ansible.com/ansible/apt_module.html


有趣,好主意。至于Ansible,也许现在。我不知道什么时候想到这个问题。无论如何,我相信知道“内部正在发生的事情”(c)很好。
埃里克·普拉顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.