Come catturare e registrare al meglio l'output di scp?
Domanda
Sto cercando di acquisire l'output da uno script di installazione (che utilizza scp) e registrarlo. Tuttavia, non sto ottenendo tutto ciò che scp sta stampando, vale a dire la barra di avanzamento.
output dello schermo:
Copia / user2 / cdb / builds / tmp / uat / myfiles / * a server / utenti / file personali come cdb
password cdb @ server: myfile 100% | ***************************** | 2503 00:00
output del registro:
Copia / user2 / cdb / builds / tmp / uat / myfiles / * a server / utenti / file personali come cdb
Mi piacerebbe davvero sapere che il mio file è arrivato lì. Ecco cosa sto provando ora inutilmente:
myscript.sh 2 > & amp; 1 | tee mylogfile.log
Qualcuno ha un buon modo per catturare l'output di scp e registrarlo?
Grazie.
Soluzione
Sembra che manchi se scp ha avuto successo o meno dal registro.
Suppongo che la barra di scorrimento non venga stampata su stdout e utilizzi ncurses o qualche altro tipo di TUI?
Potresti semplicemente guardare il valore di ritorno di scp per vedere se ha avuto successo. Mi piace
scp myfile user@host.com:. && echo success!
man scp
dice
scp exits with 0 on success or >0 if an error occurred.
Altri suggerimenti
scp stampa la sua barra di avanzamento sul terminale usando i codici di controllo. Rileverà se reindirizzi l'output e quindi ometti la barra di avanzamento.
Puoi aggirare il problema inducendo scp a pensare che funzioni in un terminale usando lo " script " comando che è installato sulla maggior parte delle distribuzioni di default:
script -q -c "scp server:/file /tmp/" > /tmp/test.txt
Il contenuto di test.txt sarà:
file 0% 0 0.0KB/s --:-- ETA
file 18% 11MB 11.2MB/s 00:04 ETA
file 36% 22MB 11.2MB/s 00:03 ETA
file 54% 34MB 11.2MB/s 00:02 ETA
file 73% 45MB 11.2MB/s 00:01 ETA
file 91% 56MB 11.2MB/s 00:00 ETA
file 100% 61MB 10.2MB/s 00:06
... che è probabilmente quello che vuoi.
Mi sono imbattuto in questo problema mentre reindirizzavo l'output di uno script interattivo in un file di registro. Non avere i risultati nel registro non è stato un problema in quanto puoi sempre valutare i codici di uscita. Ma volevo davvero che l'utente interattivo vedesse la barra di avanzamento. Questa risposta risolve entrambi i problemi.
Forse puoi usare ' script "per registrare la sessione del terminale.
scp myfile user@host.com:. && echo success!
è molto utile ma per scrivere il messaggio in un file di registro l'ho cambiato in questo modo
scp myfile user@host.com:. && echo myfile successfully copied! >> logfile 2>&1
e questo scriverà " myfile copiato correttamente! " messaggio al file di registro.
Prova:
scp server:/file /tmp/ > /dev/tty
Non posso ancora commentare :( quindi aggiungerò un aggiornamento qui ...
@Martin aveva la soluzione migliore per me, anche se se il tuo comando scp è a metà dello script, l'output potrebbe apparire dopo i comandi effettivamente eseguiti successivamente.
Penso che sia perché lo script deve eseguire il comando in una subshell ma devo ancora testarlo.
EDIT: genera effettivamente una shell, quindi se hai bisogno di cose da eseguire (e in effetti falliscono) in modo sequenziale (come in uno script di compilazione), allora dovresti aggiungere una logica all'utilizzo del comando script.
cioè.
script -q -c " il tuo comando " & Amp; & amp; dormire 1
o qualcosa di simile in modo che la shell del genitore attenda il completamento della shell del figlio prima di andare avanti.
sì, di recente stavo cercando di ottenere l'output in uno script php da proc_open () ho perso un po 'di tempo cercando di ottenere un output :-) ma è un po 'tardi qui e poi leggendo questo post qui mi sono reso conto che non ho davvero bisogno di questo output goffo alla mia sceneggiatura
solo il codice di uscita farà il lavoro :-)
$ exit_code = proc_close ($ process);
$ grep -r "Error" xyz.out > abc.txt
Qui nel comando sopra sto archiviando l'output nel file abc.txt.
Questo comando grep
è per la ricerca di testo che contiene Errore nel file xyz.out e la memorizzazione dell'output in abc.txt senza essere visualizzato sulla console.