Problem
Bei Ausführung apt-get install
in einer nicht interaktiven SSH-Sitzung wird die Sitzung nie geschlossen. Beispiel:
ssh user@target "sudo apt-get -y install my_package"
Die wird my_package
zwar richtig installiert, aber die SSH-Sitzung bleibt offen.
Frage
Gibt es eine Flagge, die SSH passieren muss, um apt-get
zur 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 update
geschlossen. Beachten Sie, dass diesapt-get update
nicht interaktivapt-get install
ist. 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 dieecho
. 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
-t
hilft es nicht, TTY mit SSH zu erzwingen. Weder nochDEBIAN_FRONTEND=noninteractive
. - Alles wurde auf Ubuntu 12_04 LTS gemacht.
ssh user@target
dann die Befehle von der Shell), funktioniert es richtig?Antworten:
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
-t
Flag erzwingt eine Pseudotty-Zuweisung, außer wenn lokal kein TTY vorhanden ist. Aber zweimal über die Flagge zu gehen, wie in dem Beispiel,-t -t
gibt vor, es zu tun. Und das löste das Problem.Siehe die SSH-Dokumentation:
Warum hat das funktioniert? Es stellt sich heraus, dass
debconf
sich das Frontend in den Logs nicht mehr beschwert. Ich glaube also, dass das Doppelte nach Bedarf gesetzt wird-t
(lockt?)debconf
, Wodurch derapt-get install
Abschluss der SSH-Sitzung sauber beendet werden kann.quelle
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.
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
quelle
ssh user@host free -m
in meiner Zielumgebung versucht und es funktioniert wie ein Zauber. Ich werde die Empfehlung als nächstes versuchen.Unter debian / jessie war ich erfolgreich mit diesem Befehl:
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
quelle