2011-03-11 18 views
9

Tengo un script de shell en el que estoy trabajando con esta línea de código que realiza un bucle a través de archivos locales (.gz) y realiza un scp. Quiero probar una falla scp si es posible. Estoy haciendo un ciclo para poder hacer eco de cada nombre de archivo en un registro para poder seguirlo.mejor manera de comprobar programáticamente un scp fallido en un script de shell

¿Alguien me puede mostrar cómo comprobar el scp fallido? o mejor aún, ¿un buen ejemplo de código para hacer esto? Gracias por tu ayuda.

for gzfile in $LOCALDMPDIR/*.gz 
do 
    /usr/bin/scp -P 2222 -i $KEYFILE $gzfile [email protected]$1:$TGTDIR 
    echo "$gzfile is done. " 2>&1 
done 
+1

También me gustaría recomendar el uso de la opción '-q' a scp lo que evita que se pida la contraseña si la clave es rechazada por el servidor remoto – Petesh

Respuesta

15

Usar $? para acceder al valor de retorno del último comando. Compruebe la página de manual para scp para verificar, pero creo que un valor de retorno de cero significa éxito. Un valor distinto de cero significa algún tipo de falla.

+0

algo así como si '$? > 1 y luego echo "scp failed" '? – jdamae

+0

@jdamae: 'if (($?> 0)); luego echo "scp failed"; fi' (o '! =') o 'si [$? -ne 0] ' –

+0

@Dennis - gracias por el ejemplo. – jdamae

4

Puede verificar el vaiverable $? para ver el código de retorno de scp. Si devuelve un valor distinto de cero, se produce un error.

0

Para los simples como yo por ahí que pasó más de Messing normal con errores de formato:

scp "fromHere" hostname:"toThere" 
if [ "$?" -eq "0" ]; 
then 
    echo "SUCCESS" 
else 
    echo "FAIL" 
fi 
+2

Tiene que haber un espacio entre [y los siguientes caracteres. (el sencillo "[" es un atajo para llamar a prueba). El ejemplo anterior me da errores, así que tuve que insertar un espacio. – Daps0l

5

uso:

if [ $? -eq 0 ]; 
then 
    echo "OK"</br> 
else 
    echo "NOK"</br> 
fi 

hay en blanco después de "[" y antes de " ] ". no rodear $? 0 y con citas

+0

también si solo quiere saber si falla, (no necesita la parte "OK"), entonces puede usar 'ne' como su operador (no igual), p. 'si [$? -ne 0]; ' –

1

También puede tratar de capturar el error a un registro:

for gzfile in $LOCALDMPDIR/*.gz 
do 
    /usr/bin/scp -P 2222 -i $KEYFILE $gzfile [email protected]$1:$TGTDIR 2>>/var/log/scperror.log \ 
    && echo "$gzfile is done." \ 
    || echo "scp error: $gzfile" 
done 
Cuestiones relacionadas