bash shell - codice di uscita e di uscita dello script remoto ssh?


23

Vorrei usare la shell per invocare uno script su un server remoto. Vorrei catturare l'output di quello script (i suoi messaggi di log) e il codice di uscita che restituisce.

Se lo faccio:

ssh user@server /usr/local/scripts/test_ping.sh
echo "$?"

Ricevo il codice di uscita ma non riesco a catturare i messaggi di registrazione remota.

Se lo faccio:

local RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo "$?" 
LOG "${RESULTS}";

Riesco a registrare il mio output utilizzando la mia funzione LOG ma non riesco a ottenere un codice di uscita corretto, presumo che il codice che ottengo sia il codice dall'assegnazione varianble.

Vorrei continuare a usare la mia funzione LOG per catturare tutto l'output mentre si formatta e invia cose a un file, syslog e lo schermo per me.

Come posso acquisire i risultati in un var E ottenere il codice di uscita corretto dallo script remoto?


Risposte:


37

Il motivo per cui non si ottiene il codice di errore corretto è perché in localrealtà è l'ultima cosa eseguita. È necessario dichiarare la variabile come locale prima di eseguire il comando.

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?

Puoi vedere il problema qui:

$ bar() { foo=$(ls asdkjasd 2>&1); echo $?; }; bar
2
$ bar() { local foo=$(ls asdkjasd 2>&1); echo $?; }; bar
0
$ bar() { local foo; foo=$(ls asdkjasd 2>&1); echo $?; }; bar
2

8

Il "locale" sembra essere il problema. Questo funziona per me:

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?

anche tu avevi ragione, ma Jodanm era più veloce!
mlinlin

Sì, 26 secondi.
Hauke ​​Laging

5
Non è un corso di inglese ma non è corretto dire "più veloce".
mtahmed,

5
So che è stato uno scherzo. Peccato suppongo. Su Internet nessuno sa che sei un cane.
mconlin,

anche la risposta di Jordan spiega perché questo era il problema :)
Doktor J,

3

In realtà, nessuna delle risposte sopra intrappola il codice di errore ssh e il messaggio, che potrebbe essere fatto come segue (ignora le mie funzioni personalizzate):

# move the deployment package from the tmp dir
msg=$(ssh -i "$(eval echo $identity_file)" -o ConnectTimeout=5 "$ssh_user"'@'"$ssh_server" \
sudo -iu "$etl_user" bash "$tgt_deployment_dir"'/src/bash/'"$run_unit/$run_unit"'.sh' \
    -a create-relative-package 2>&1)

# fail on any non-success
export exit_code=$?
export err_msg="network error: ""$msg"
test $exit_code -ne 0 && doExit $exit_code $err_msg
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.