Sesja SSH nigdy się nie zamyka podczas wykonywania „instalacji apt-get”

14

Problem

Podczas pracy apt-get installw nieinteraktywnej sesji SSH sesja nigdy się nie zamyka. Przykład:

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

Został my_packagepoprawnie zainstalowany, ale sesja SSH po prostu zawisła.

Pytanie

Czy jest jakaś flaga, aby przekazać SSH, aby dostać się apt-getdo pracy?


Dodatkowe informacje

Kontekst

Instalacja zdalna służy do automatycznego wdrażania pakietu na serwerze integracyjnym. Jak tylko wprowadzimy pewne zmiany kodu do repozytorium, zadanie pobiera kod, buduje pakiet i wdraża go podczas integracji, aby sprawdzić, czy wszystko działa dobrze (jeśli chodzi o wdrożenie).

Już próbowałem i notatki

  • Ta sama sesja SSH, która jest wykonywana, zostaje apt-get updatezamknięta. Zauważ, że apt-get updatenie jest interaktywny, podczas gdy apt-get installjest. Może to sugerować, że interaktywność jest problemem.
  • Polecenie jak ssh user@target "sudo apt-get install my_package && echo Hello"nigdy nie dociera do echo.
  • debconf narzeka, że ​​nie może znaleźć ładnej nakładki (Display, Readline) i wraca do Teletype (chociaż Readline jest dostępny).
  • W odniesieniu do frontendu debconfa przejście -tdo wymuszenia TTY z SSH nie pomaga. Ani DEBIAN_FRONTEND=noninteractive.
  • Wszystko zostało zrobione na Ubuntu 12_04 LTS.
Eric Platon
źródło
Jeśli wykonasz polecenie instalacji ręcznie (tj. ssh user@targetWtedy polecenia z powłoki), czy działa ono poprawnie?
Pierścień Ø
Polecenie install działa dobrze, gdy jest wykonywane ręcznie (co prowadzi do wniosku, że istnieje problem z typami sesji niezalogowanych / interaktywnymi).
Eric Platon

Odpowiedzi:

6

Następująca odpowiedź na SF załatwiła sprawę:

ssh nie wykonuje polecenia zdalnego po uruchomieniu ze skryptu cron bash

Te -tsiły flag przydział pseudo-tty, może z wyjątkiem, gdy nie ma TTY lokalnie. Ale dwukrotne przekazanie flagi jak -t -ttylko udaje, że to robi. I to rozwiązało problem.

Zobacz dokumentację SSH:

-t Wymusza alokację pseudo-tty. Można to wykorzystać do wykonania dowolnych programów ekranowych na zdalnym komputerze, co może być bardzo przydatne, np. Przy wdrażaniu usług menu. Wiele opcji -t wymusza alokację tty, nawet jeśli ssh nie ma lokalnego tty.

Dlaczego to zadziałało? Okazuje się, że debconfjuż nie narzeka na frontend w logach. Tak więc uważam, że podwójne -tzestawy (przynęty?) W debconfrazie potrzeby, co pozwala na apt-get installzakończenie, aby zakończyć sesję SSH czysto.

Eric Platon
źródło
Uważam, że to dobra odpowiedź, ale nie zaznaczę jej od razu. Po pierwsze dlatego, że sam sobie odpowiedziałem, a po drugie, mogą istnieć lepsze / bardziej ogólne odpowiedzi. Wróćmy do tego w przyszłości.
Eric Platon
1

Przeglądając to, może to zrobić. Wywołanie dowolnego polecenia powinno nastąpić po wyjściu i heredoc. Znalazłem rozwiązanie, ale nie wypróbowałem go osobiście.

ssh user@myremotemachine <<-EOF
free -m
exit
EOF

Oryginalna odpowiedź pochodzi stąd: http://www.thetechrepo.com/main-articles/529-execute-a-command-remotely-over-ssh-and-then-close-the-connection

koressak
źródło
Dziękuję, koressak. Myślę, że to zależy od powłoki i dystrybucji systemu operacyjnego. Właśnie próbowałem ssh user@host free -mw moim docelowym środowisku i działa jak urok. Spróbuję następnie rekomendacji.
Eric Platon
Właśnie próbowałem pełnego biegu z podejściem heredoc. To nie rozwiązało problemu. Sesja SSH zawiesza się w taki sam sposób, jak przedstawiono w pytaniu. Jeszcze raz dziękuję za odpowiedź i wskaźnik!
Eric Platon
1

W debian / jessie udało mi się wykonać to polecenie:

ssh user@host "TERM=READLINE sudo apt-get install --reinstall less && echo done"

Ale może powinieneś rozważyć użycie ansible do tego i innych nadchodzących zadań http://docs.ansible.com/ansible/apt_module.html

ThorstenS
źródło
Ciekawy, dobry pomysł. Co do Ansible, być może teraz. Nie wiem, kiedy przyszło mi do głowy pytanie. W każdym razie uważam, że dobrze jest wiedzieć „co się dzieje w środku” (c).
Eric Platon,