Die SSH-Sitzung wird nie geschlossen, wenn "apt-get install" ausgeführt wird.

14

Problem

Bei Ausführung apt-get installin einer nicht interaktiven SSH-Sitzung wird die Sitzung nie geschlossen. Beispiel:

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

Die wird my_packagezwar richtig installiert, aber die SSH-Sitzung bleibt offen.

Frage

Gibt es eine Flagge, die SSH passieren muss, um apt-getzur Arbeit zu kommen?


zusätzliche Information

Kontext

Die Remoteinstallation wird für die automatisierte Bereitstellung eines Pakets auf einem Integrationsserver verwendet. Sobald wir einige Codeänderungen in ein Repository übertragen, ruft ein Job den Code ab, erstellt das Paket und stellt es bei der Integration bereit, um zu überprüfen, ob alles ordnungsgemäß funktioniert (was die Bereitstellung betrifft).

Bereits ausprobiert & Notizen

  • Dieselbe ausgeführte SSH-Sitzung wird ordnungsgemäß apt-get updategeschlossen. Beachten Sie, dass dies apt-get updatenicht interaktiv apt-get installist. Dies könnte darauf hindeuten, dass Interaktivität ein Problem darstellt.
  • Ein Befehl wie ssh user@target "sudo apt-get install my_package && echo Hello"nie erreicht die echo.
  • debconf beschwert sich, dass es kein nettes Frontend findet (Display, Readline) und auf Teletype zurückgreift (obwohl Readline verfügbar ist).
  • In Bezug auf das Debconf-Frontend -thilft es nicht, TTY mit SSH zu erzwingen. Weder noch DEBIAN_FRONTEND=noninteractive.
  • Alles wurde auf Ubuntu 12_04 LTS gemacht.
Eric Platon
quelle
Wenn Sie den Befehl install manuell ausführen (dh ssh user@targetdann die Befehle von der Shell), funktioniert es richtig?
Ruft den Ø
Der Befehl install funktioniert nur dann einwandfrei, wenn er manuell ausgeführt wird (was zu der Annahme führt, dass ein Problem mit nicht angemeldeten / interaktiven Sitzungstypen vorliegt).
Eric Platon

Antworten:

6

Die folgende Antwort auf SF hat den Trick gemacht:

ssh kann den Remote-Befehl nicht ausführen, wenn er über ein Cron-Bash-Skript ausgeführt wird

Das -tFlag erzwingt eine Pseudotty-Zuweisung, außer wenn lokal kein TTY vorhanden ist. Aber zweimal über die Flagge zu gehen, wie in dem Beispiel, -t -tgibt vor, es zu tun. Und das löste das Problem.

Siehe die SSH-Dokumentation:

-t Pseudotty-Zuweisung erzwingen. Hiermit können beliebige bildschirmbasierte Programme auf einem entfernten Rechner ausgeführt werden, was zB bei der Implementierung von Menüdiensten sehr hilfreich sein kann. Mehrere -t-Optionen erzwingen die Zuweisung von tty, auch wenn ssh kein lokales tty hat.

Warum hat das funktioniert? Es stellt sich heraus, dass debconfsich das Frontend in den Logs nicht mehr beschwert. Ich glaube also, dass das Doppelte nach Bedarf gesetzt wird -t(lockt?) debconf, Wodurch der apt-get installAbschluss der SSH-Sitzung sauber beendet werden kann.

Eric Platon
quelle
Ich glaube, das ist eine gute Antwort, aber ich werde sie nicht sofort als solche markieren. Erstens, weil ich selbst geantwortet habe, und zweitens, weil es vielleicht bessere / allgemeinere Antworten gibt. Zurück in die Zukunft.
Eric Platon
1

Wie ich es durchgesehen habe, kann dies den Job machen. Aufrufen eines beliebigen Befehls, auf den exit und heredoc folgen sollen. Die Lösung gefunden, aber nicht persönlich ausprobiert.

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

Die ursprüngliche Antwort kommt von hier: http://www.thetechrepo.com/main-articles/529-execute-a-command-remotely-over-ssh-and-then-close-the-connection

koressak
quelle
Danke, Koressak. Ich denke, das hängt von der Shell und der Betriebssystemverteilung ab. Ich habe es gerade ssh user@host free -min meiner Zielumgebung versucht und es funktioniert wie ein Zauber. Ich werde die Empfehlung als nächstes versuchen.
Eric Platon
Ich habe gerade einen kompletten Lauf mit dem Heredoc-Ansatz versucht. Das hat das Problem nicht gelöst. Die SSH-Sitzung hängt auf die gleiche Weise wie in der Frage dargestellt. Nochmals vielen Dank für die Antwort und den Hinweis!
Eric Platon
1

Unter debian / jessie war ich erfolgreich mit diesem Befehl:

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

Aber vielleicht sollten Sie in Betracht ziehen, ansible für diese und andere anstehende Aufgaben zu verwenden: http://docs.ansible.com/ansible/apt_module.html

ThorstenS
quelle
Interessante, gute Idee. Was Ansible betrifft, vielleicht jetzt. Ich weiß nicht, wann mir die Frage in den Sinn kam. Wie auch immer, ich glaube, es ist gut zu wissen, "was drinnen passiert" (c).
Eric Platon