При беге apt-get install
в неинтерактивном сеансе SSH сеанс никогда не закрывается. Пример:
ssh user@target "sudo apt-get -y install my_package"
В my_package
устанавливается правильно, но сеанс SSH просто открывается.
Есть ли какой-нибудь флаг для передачи SSH, чтобы получить apt-get
работать?
Удаленная установка используется для автоматического развертывания пакета на сервере интеграции. Как только мы отправляем некоторые изменения кода в репозиторий, задание извлекает код, строит пакет и развертывает его при интеграции, чтобы проверить, что все работает хорошо (что касается развертывания).
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 доступен).-t
заставить TTY с SSH не помогает. Ни то, ни другое DEBIAN_FRONTEND=noninteractive
. Следующий ответ о SF сделал свое дело:
ssh не может выполнить удаленную команду при запуске из сценария cron bash
В -t
flag вызывает выделение псевдо-tty, кроме случаев, когда локально TTY отсутствует. Но передать флаг дважды, как в -t -t
просто делает вид, что делает это. И это решило проблему.
См. Документацию по SSH:
-t Принудительное выделение псевдо-tty. Это можно использовать для выполнения произвольных экранных программ на удаленном компьютере, что может быть очень полезно, например при реализации услуг меню. Несколько параметров -t принудительно выделяют tty, даже если ssh не имеет локального tty.
Итак, почему это сработало? Оказывается, что debconf
больше не жалуется на интерфейс в логах. Так что я считаю, что двойной -t
наборы (приманки?) debconf
по мере необходимости, что позволяет apt-get install
завершение для правильного завершения сеанса SSH.
В debian / jessie мне удалось выполнить эту команду:
ssh user@host "TERM=READLINE sudo apt-get install --reinstall less && echo done"
Но, возможно, вам следует подумать об использовании возможности для этой и других предстоящих задач. http://docs.ansible.com/ansible/apt_module.html
Насколько я понял, это может сработать. Вызов любой команды должен сопровождаться 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