Сеанс 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команди з оболонки), чи правильно вона працює?
Кільце Ø

Команда встановлення просто працює добре, коли виконується вручну (тим самим приводячи до думки, що існує проблема з типами сеансу без входу / інтерактивного сеансу).
Ерік Платон

Відповіді:


6

Наступна відповідь на SF зробила трюк:

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

В -tпрапор сили розподілу псевдо-термінал, за винятком , можливо , коли немає TTY локально. Але пропускати прапор двічі, як і -t -tтільки прикидається, що це робимо. І це вирішило проблему.

Дивіться документацію на SSH:

-t Виділення псевдо-тти. Це може бути використано для виконання довільних екранних програм на віддаленій машині, що може бути дуже корисно, наприклад, при реалізації служб меню. Опції з декількома параметрами змушують розподіляти tty, навіть якщо ssh не має локальних tty.

Тепер, чому це працювало? Виявляється, debconfбільше не скаржиться на фронтал в колодах. Тому я вважаю, що подвійні -tнабори (приманює?) За debconfпотребою, що дозволяє apt-get installзавершити сеанс SSH чисто.


Я вважаю, що це хороша відповідь, але я не зазначу це відразу як є. По-перше, тому що я відповів сам, а по-друге, можуть бути кращі / загальніші відповіді. Повертайтеся до цього в майбутньому.
Ерік Платон

1

Коли я переглянув це, це може зробити цю роботу. Виклик будь-якої команди повинен слідувати виходу та гередоку. Знайшов рішення, але не намагався його особисто.

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


Дякую, корессак. Я думаю, це залежить від оболонки та розподілу ОС. Я щойно спробував ssh user@host free -mу своєму цільовому середовищі, і це працює як шарм. Я збираюся спробувати наступну рекомендацію.
Ерік Платон

Я щойно спробував повний пробіг із підходом гередока. Це не вирішило проблеми. Сеанс 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, можливо, зараз. Я не знаю, коли питання прийшло в голову. У всякому разі, я вважаю, що добре знати "що відбувається всередині" (с).
Ерік Платон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.