Orso con me, la descrizione è lunga.ssh non restituisce in modo affidabile l'output dal comando remoto
In perl voglio eseguire un semplice comando remoto e acquisire l'output utilizzando perl :: Expect). Tuttavia ho scoperto che il mio array di risultati a volte era vuoto. Ho fatto molti esperimenti e credo che il problema è che la mia connessione ssh remota sta terminando, con successo, prima che il comando remoto possa eseguire il flush allo stout.
- il comportamento è lo stesso sia che si esegua perl :: Expect o ssh direttamente dalla riga di comando di bash.
- tutti gli host nel mio centro dati hanno questo comportamento. Più l'host è caricato, più frequente è l'errore. Per gli host pesanti non riesco a ottenere un risultato circa il 15% delle volte. Il tasso di errore è vicino a 0 su host più leggeri.
- Il comando remoto non ha importanza.
- So che sto superando la richiesta della password e nell'host remoto. Usando 'ssh -vvv' Vedo che il comando remoto viene eseguito ogni volta.
- Ho sperimentato eseguendo un comando dummy finale e controllando il codice di ritorno remoto nella speranza di svuotare il buffer stdout. Niente è stato affidabile.
Negli esempi seguenti sono stati redatti nomi utente/gruppo/host. A parte questo, l'output è un taglia-incolla non modificato.
> while true ; do echo "start"; ssh -l user host 'date; ls -l abc; echo $?'; echo "end"; done start Password: Mon Oct 6 13:06:51 PDT 2014 -rw-r--r-- 1 user group 34538 Dec 6 2012 abc 0 end start Password: end start Password: Mon Oct 6 13:06:54 PDT 2014 end
Se tee il comando remoto con un file fittizio poi stdout è anche arrossato e affidabile ottenere l'uscita dal mio comando ogni volta. Sfortunatamente, questo è un lavoro di hacking in giro.
while true ; do echo "start"; ssh -l user host 'date | tee -a /tmp/date.txt' ; echo "end"; done
Non ottenere appeso sui dettagli Perl in questo esempio. Il bit interessante è l'array @output restituito. In Perl ho il seguente comando:
città :: rc :: :: Utils executeRemoteCommand ($ cmd, $ passaggio, 0, undef, undef, \ @output)
che alla fine entra in profondità per chiamare questo :
my $ ssh = Expect-> spawn ($ comando);
Il comando $ risultante è questo: "? Ls -l abc; echo 'DONE'; echo $"
ssh ospitanti utente -l
di successo 'di stampa Dumper \ @output':
$VAR1 = [
#0
" ",
#1
"-rw-r--r-- 1 user group 34538 Dec 6 2012 abc",
#2
"DONE",
#3
0
];
Failed 'Dumper print \ @output':
$VAR1 = [
#0
" ",
#1
"DONE",
#2
0
];
Si noti come il risultato dei 'ls' non era ancora il catturato l'eco di "DONE" era. Ho anche visto dove l'array di output ha il risultato ls ma non l'eco. Ho anche visto dove mancavano entrambi i risultati.
Qualsiasi intuizione sarebbe molto apprezzata. A questo punto sono perplesso e ora devo programmare queste chiamate remote in un ciclo per verificare un risultato previsto. Questo è un terribile hack. Preferirei fissare la causa principale.
grazie molto
'" ssh -l user host "ls -l abc; echo" FATTO "; echo $?" ' Qualsiasi motivo particolare che precede' "' before 'ls'? C'è anche un numero dispari di virgolette – Travis
, vorrei sperimentare con la protezione del valore '$?' Dall'essere sustituted con il valore corrente. Quindi proverei alcune variazioni su \ '\ $?', '\\\ $?'. In bocca al lupo. – shellter
Travis - quotazioni fisse. Questo era solo un errore di battitura in questo post. L'esecuzione effettiva era corretta. Tutti e tre i comandi sono eseguiti sul lato remoto. –