问题
在非交互式 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
答案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