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

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 жалуется, что не может найти хороший внешний интерфейс (Display, Readline) и возвращается к Teletype (хотя Readline доступен).
  • Что касается внешнего интерфейса debconf, переход -tна TTY с SSH не помогает. Ни один DEBIAN_FRONTEND=noninteractive.
  • Все было сделано на Ubuntu 12_04 LTS.
Эрик Платон
источник
Если вы выполняете команду установки вручную (то есть ssh user@targetкоманды из оболочки), она работает правильно?
Кольцо Ø
Команда install просто отлично работает, когда выполняется вручную (что приводит к мысли, что существует проблема с неинтерактивными / интерактивными типами сеансов).
Эрик Платон

Ответы:

6

Следующий ответ на SF сделал свое дело:

ssh не может выполнить удаленную команду при запуске из скрипта cron bash

В -tфлаг силы распределения псевдо-терминал, за исключением , возможно , когда нет TTY локально. Но прохождение флага дважды, как в, -t -tтолько делает вид, что делает это. И это решило проблему.

Смотрите документацию по SSH:

-T Force псевдо-tty выделения. Это может быть использовано для выполнения произвольных программ на экране на удаленной машине, что может быть очень полезно, например, при реализации сервисов меню. Несколько опций -t заставляют tty выделяться, даже если ssh не имеет локального tty.

Теперь, почему это работает? Оказывается, debconfбольше не жалуются на фронтенд в логах. Поэтому я считаю, что двойные -tнаборы (приманки?) По debconfмере необходимости, что позволяет apt-get installзавершить, чтобы чисто завершить сеанс SSH.

Эрик Платон
источник
Я считаю, что это хороший ответ, но я не буду отмечать его сразу как есть. Во-первых, потому что я ответил сам, а во-вторых, могут быть лучшие / более общие ответы. Вернемся к этому в будущем.
Эрик Платон
1

Поскольку я просмотрел это, это может сделать работу. Вызов любой команды должен сопровождаться 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

koressak
источник
Спасибо, корессак. Я думаю, это зависит от оболочки и дистрибутива ОС. Я только что попробовал 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

ThorstenS
источник
Интересная, хорошая идея. Что касается Ansible, возможно, сейчас. Я не знаю, когда еще возник вопрос. Во всяком случае, я считаю, что это хорошо знать "что происходит внутри" (с).
Эрик Платон