Назад | Перейти на главную страницу

Сеанс SSH никогда не закрывается при выполнении «apt-get install»

Проблема

При беге apt-get install в неинтерактивном сеансе SSH сеанс никогда не закрывается. Пример:

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

В my_package устанавливается правильно, но сеанс SSH просто открывается.

Вопрос

Есть ли какой-нибудь флаг для передачи SSH, чтобы получить apt-get работать?


Дополнительная информация

Контекст

Удаленная установка используется для автоматического развертывания пакета на сервере интеграции. Как только мы отправляем некоторые изменения кода в репозиторий, задание извлекает код, строит пакет и развертывает его при интеграции, чтобы проверить, что все работает хорошо (что касается развертывания).

Уже пробовали и примечания

Следующий ответ о 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