2010-10-08 16 views
5

Ho uno script di bash con alcuni comandi scp all'interno. Funziona molto bene ma, se provo a reindirizzare il mio stdout con "./myscript.sh> registro", solo i miei echi espliciti sono mostrati nel file "log". Manca l'output scp.Bash, reindirizzamento stdout di comandi come scp

if $C_SFTP; then 
    scp -r [email protected]$C_SFTP_HOST:$C_SOURCE "$C_TMPDIR" 
fi 

Ok, cosa dovrei fare ora? Grazie

risposta

5

scp utilizza un terminale interattivo per stampare quella barra di avanzamento. La stampa di quell'output su un file non ha alcun senso, quindi scp rileva quando il suo output viene reindirizzato in un altro posto diverso da un terminale e disabilita questo output.

Ciò che ha senso, tuttavia, è redirigere il suo output di errore nel file in caso ci siano errori. Potresti voler disabilitare l'output standard se vuoi.

Ci sono due modi possibili per farlo. In primo luogo è quello di richiamare lo script con il reindirizzamento sia stderr e stdout nel file di registro:

./myscript.sh >log 2>&1 

In secondo luogo, è quello di raccontare bash per fare questo diritto nello script:

#!/bin/sh 

exec 2>&1 

if $C_SFTP; then 
    scp -r [email protected]$C_SFTP_HOST:$C_SOURCE "$C_TMPDIR" 
fi 

... 

Se è necessario controllare gli errori, basta verificare che $? è 0 dopo comando scp viene eseguito:

if $C_SFTP; then 
    scp -r [email protected]$C_SFTP_HOST:$C_SOURCE "$C_TMPDIR" 
    RET=$? 
    if [ $RET -ne 0 ]; then 
     echo SOS 2>&1 
     exit $RET 
    fi 
fi 

Un'altra opzione è di fare in set -e y il nostro script che dice allo script di bash di segnalare un errore non appena uno dei comandi negli script fallisce:

#!/bin/bash 

set -e 

... 

Spero che aiuti. In bocca al lupo!

+1

'se [-ne "$ RET" "0"]; allora ... non c'è bisogno di "intorno a 0,' -ne/-eq' testerà i valori interi – Anders

+0

@Anders: solo un'abitudine. –

2

Purtroppo l'output di SCP non può semplicemente essere reindirizzato allo stdout a quanto pare.

Volevo ottenere la velocità di trasferimento media del mio trasferimento SCP e l'unico modo in cui potevo riuscire a farlo era quello di inviare stderr e stdout in un file, e quindi di echo di nuovo il file su stdout.

Ad esempio:

#!/bin/sh 
echo "Starting with upload test at `date`:" 

scp -v -i /root/.ssh/upload_test_rsa /root/uploadtest.tar.gz [email protected]:/home/speedtest/uploadtest.tar.gz > /tmp/scp.log 2>&1 
grep -i bytes /tmp/scp.log 
rm -f /tmp/scp.log 

echo "Done with upload test at `date`." 

che comporterebbe il seguente output:

Starting with upload test at Thu Sep 20 13:04:44 SAST 2012: 
Transferred: sent 10191920, received 5016 bytes, in 15.7 seconds 
Bytes per second: sent 650371.2, received 320.1 
Done with upload test at Thu Sep 20 13:05:04 SAST 2012. 
1

È gatto semplicemente provare il TTY con:

[ ~]#echo "hello" >/dev/tty 
hello 

Se funziona, provare:

[ ~]# scp <user>@<host>:<source> /dev/tty 2>/dev/null 

Questo ha funzionato per me ...

0

ho trovato una soluzione di massima per SCP:

$ scp -qv [email protected]$HOST:$SRC $DEST 

Secondo la pagina SCP uomo, -q (tranquilla) disabilita la barra di avanzamento, così come disabilitando tutti gli altri in uscita. Aggiungi -v (dettagliato), ottieni un mucchio di output ... e il misuratore di avanzamento è ancora disabilitato! Disabilitare l'indicatore di avanzamento consente di reindirizzare l'output su un file.

Se non avete bisogno di tutto l'output di autenticazione di debug, reindirizzare l'output a stdout e grep i bit non si vuole:

$ scp -qv [email protected]$HOST:$SRC $DEST 2>&1 | grep -v debug 

uscita finale è qualcosa di simile:

Executing: program /usr/bin/ssh host myhost, user (unspecified), command scp -v -f ~/file.txt 
OpenSSH_6.0p1 Debian-4, OpenSSL 1.0.1e 11 Feb 2013 
Warning: Permanently added 'myhost,10.0.0.1' (ECDSA) to the list of known hosts. 
Authenticated to myhost ([10.0.0.1]:22). 
Sending file modes: C0644 426 file.txt 
Sink: C0644 426 file.txt 
Transferred: sent 2744, received 2464 bytes, in 0.0 seconds 
Bytes per second: sent 108772.7, received 97673.4 

Inoltre, questo può essere reindirizzato a un file:

$ scp -qv [email protected]$HOST:$SRC $DEST 2>&1 | grep -v debug > scplog.txt 
Problemi correlati