La sessione SSH non si chiude mai quando si esegue "apt-get install"


14

Problema

Durante l'esecuzione apt-get installin una sessione SSH non interattiva, la sessione non si chiude mai. Esempio:

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

Il my_packageviene installato correttamente, ma la sessione SSH appena dondola aperta.

Domanda

C'è qualche bandiera per passare a SSH per mettersi apt-getal lavoro?


Informazioni aggiuntive

Contesto

L'installazione remota viene utilizzata per la distribuzione automatica di un pacchetto su un server di integrazione. Non appena trasferiamo alcune modifiche al codice in un repository, un lavoro estrae il codice, crea il pacchetto e lo distribuisce sull'integrazione per verificare che tutto funzioni correttamente (per quanto riguarda la distribuzione).

Già provato e note

  • La stessa sessione SSH in esecuzione si apt-get updatechiude in modo pulito. Si noti che apt-get updatenon è interattivo, mentre lo apt-get installè. Ciò può suggerire che l'interattività è un problema.
  • Un comando come ssh user@target "sudo apt-get install my_package && echo Hello"non raggiunge mai il echo.
  • debconf si lamenta che non riesce a trovare un bel frontend (Display, Readline) e ricade su Teletype (sebbene Readline sia disponibile).
  • In relazione al frontend di debconf, passare -tper forzare TTY con SSH non aiuta. Nemmeno DEBIAN_FRONTEND=noninteractive.
  • Tutto è stato fatto su Ubuntu 12_04 LTS.

Se si esegue il comando di installazione manualmente (ovvero ssh user@targeti comandi dalla shell) funziona correttamente?
Anello Ø

Il comando di installazione funziona correttamente quando eseguito manualmente (portando quindi a pensare che ci sia un problema con i tipi di sessione non di accesso / interattivi).
Eric Platon,

Risposte:


6

La seguente risposta su SF ha funzionato:

ssh non riesce a eseguire il comando remoto quando viene eseguito dallo script cron bash

La -tbandiera impone un'allocazione pseudo-tty, tranne forse quando non c'è TTY localmente. Ma passare la bandiera due volte come se -t -tfingesse di farlo. E questo ha risolto il problema.

Vedi la documentazione SSH:

-t Forza l'allocazione pseudo-tty. Questo può essere usato per eseguire programmi arbitrari basati su schermo su una macchina remota, il che può essere molto utile, ad esempio quando si implementano servizi di menu. Le opzioni multiple -t impongono l'allocazione di tty, anche se ssh non ha tty locale.

Ora, perché ha funzionato? Si scopre che debconfnon si lamenta più del frontend nei registri. Quindi credo che i doppi -tinsiemi (esche?) debconf, Se necessario, che consenta apt-get installal completamento di terminare la sessione SSH in modo pulito.


Credo che questa sia una buona risposta, ma non la segnerò immediatamente così com'è. Innanzitutto perché mi sono risposto, e in secondo luogo, potrebbero esserci risposte migliori / più generiche. Torniamo su questo in futuro.
Eric Platon,

1

Mentre lo guardavo, questo potrebbe fare il lavoro. Chiamare qualunque comando dovrebbe essere seguito da exit ed heredoc. Ho trovato la soluzione, ma non l'ho provata personalmente.

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

La risposta originale viene da qui: http://www.thetechrepo.com/main-articles/529-execute-a-command-remotely-over-ssh-and-then-close-the-connection


Grazie, Koressak. Immagino che questo dipenda dalla shell e dalla distribuzione del sistema operativo. Ho appena provato ssh user@host free -mnel mio ambiente di destinazione e funziona come un fascino. Proverò la raccomandazione dopo.
Eric Platon,

Ho appena provato una corsa completa con l'approccio ereditario. Ciò non ha risolto il problema. La sessione SSH si blocca nello stesso modo presentato nella domanda. Grazie ancora per la risposta e il puntatore!
Eric Platon,

1

Sotto debian / jessie ho avuto successo con questo comando:

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

Ma forse dovresti prendere in considerazione l'uso di ansible per questo e altri compiti futuri http://docs.ansible.com/ansible/apt_module.html


Interessante, buona idea. Per quanto riguarda Ansible, forse ora. Non so quando mi è venuta in mente la domanda. Ad ogni modo, credo che sia bello sapere "cosa sta succedendo dentro" (c).
Eric Platon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.