2012-10-11 96 views
18

Me gustaría comprobar si existe un archivo determinado en el host remoto. He intentado esto:compruebe si el archivo existe en el host remoto con ssh

$ if [ ssh [email protected] -p 19999 -e /home/reg/Dropbox/New_semiosNET/Research_and_Development/Puffer_and_Traps/Repeaters_Network/UBC_LOGS/log1349544129.tar.bz2 ] then echo "okidoke"; else "not okay!" fi 
-sh: syntax error: unexpected "else" (expecting "then") 
+0

Usted está tratando de ejecutar ese archivo ... –

+1

En general, necesitas un punto y coma antes de 'then':' if cmd; luego cmd; else cmd; fi' –

Respuesta

23

respuestas para esta pregunta están en todas partes. El siguiente es un enfoque simple.

if ssh $HOST stat $FILE_PATH \> /dev/null 2\>\&1 
      then 
        echo "File exists" 
      else 
        echo "File does not exist" 

fi 
+0

Cómo invertir el if? 'si [-n ...]'? – redolent

+0

¡Puedes invertir el si al agregar un signo de exclamación! – Ernestas

+10

Esto sería mejor si acaba de usar 'test' en lugar de' stat'. 'test' es un estándar IEEE. 'stat' no es estándar. 'test' no generará mensajes en caso de falla, simplemente devuelve un estado de salida estándar. – kojiro

3

Te estás perdiendo ; s. La sintaxis general si se pone todo en una sola línea sería:

if thing ; then ... ; else ... ; fi 

la thing puede ser casi cualquier cosa que devuelve un código de salida. Se toma la rama then si ese thing devuelve 0, la rama else en caso contrario.

[ no es la sintaxis, que es el programa test (echa un vistazo a ls /bin/[, lo que realmente existe, man test de los documentos – aunque también puede tener una versión integrada con diferentes características/adicionales.) Que se utiliza para probar diferentes condiciones comunes en archivos y variables. (Tenga en cuenta que [[ por otro lado es sintaxis y es manejado por su caparazón, si es compatible).

para su caso, usted no desea utilizar test directa, que desea probar algo en el host remoto. Así que trate de algo como:

if ssh [email protected] test -e "$file" ; then ... ; else ... ; fi 
+1

Ni siquiera debería ser 'if [', sino simplemente 'si ssh ...'. –

+0

Muy bien, estaba viendo los dos problemas sin unirlos. – Mat

30

Además de las respuestas anteriores, no es la forma abreviada de hacerlo:

ssh -q $HOST [[ -f $FILE_PATH ]] && echo "File exists" || echo "File does not exist"; 

-q es el modo silencioso, se suprimen las advertencias y mensajes.

Como se mencionó @Mat, una ventaja de la prueba como ésta es que se puede cambiar fácilmente la -f para cualquier operador de la prueba que te gusta: -nt, -d, etc ... -s

Operadores de prueba:http://tldp.org/LDP/abs/html/fto.html

+4

+1, pero esto supone que el host receptor tiene bash y que es el intérprete de comandos predeterminado del usuario. – kojiro

+1

Realmente me gusta su solución. Y solo para algunos estudiantes de primer año como yo en la versión if-else: si ssh -q $ {HOST} [[-f $ {FILE_PATH}]]; luego echo "Archivo existe"; else "Archivo no encontrado"; fi – yatsa

1
ssh -q $HOST [[ -f $FILE_PATH ]] && echo "File exists" 

lo anterior se ejecutará el comando echo en la máquina que está ejecutando el comando ssh desde. Para tener el servidor remoto para ejecutar el comando:

ssh -q $HOST "[[ ! -f $FILE_PATH ]] && touch $FILE_PATH" 
1

Puede especificar la cáscara para ser utilizado por el host remoto localmente.

echo 'echo "Bash version: ${BASH_VERSION}"' | ssh -q localhost bash 

Y tenga cuidado de (solo) citar las variables que desea expandir por el host remoto; de lo contrario, la expansión variable será realizada por su shell local.

# example for local/remote variable expansion 
{ 
echo "[[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive'" | 
    ssh -q localhost bash 
echo '[[ $- == *i* ]] && echo "Interactive" || echo "Not interactive"' | 
    ssh -q localhost bash 
} 

Así, para comprobar si existe un archivo determinado en el host remoto se puede hacer lo siguiente:

host='localhost' # localhost as test case 
file='~/.bash_history' 
if `echo 'test -f '"${file}"' && exit 0 || exit 1' | ssh -q "${host}" sh`; then 
#if `echo '[[ -f '"${file}"' ]] && exit 0 || exit 1' | ssh -q "${host}" bash`; then 
    echo exists 
else 
    echo does not exist 
fi 
17

no puede conseguir mucho más sencillo que esto :)

ssh host "test -e /path/to/file" 
if [ $? -eq 0 ]; then 
    # your file exists 
fi 
+0

Bueno, sí puede, podría cambiar '[$? -eq 0] 'con el comando' ssh' en sí :) – dimo414

+2

¡De hecho, considero que su solución es la mejor de toda la lista de ideas sugeridas! – GhostCat

4

una línea, citando correctamente

ssh remote_host test -f "/path/to/file" && echo found || echo not found 
0

Yo quería también para verificar si existe un archivo remoto pero con RSH. He intentado con las soluciones anteriores, pero no funcionaron con RSH.

Por último, lo hice función corta que funciona muy bien:

function existRemoteFile() 
{ 
REMOTE=$1 
FILE=$2 
RESULT=$(rsh -l user $REMOTE "test -e $FILE && echo \"0\" || echo \"1\"") 
if [ $RESULT -eq 0 ] 
then 
    return 0 
else 
    return 1 
fi 
} 
0

En la máquina CentOS, la fiesta oneliner que trabajó para mí era:

if ssh <servername> "stat <filename> > /dev/null 2>&1"; then echo "file exists"; else echo "file doesnt exits"; fi 

Es necesario redirección de E/S (como se la respuesta principal), así como comillas alrededor del comando para ejecutar en remoto.

1

Prueba si un archivo existe:

HOST="example.com" 
FILE="/path/to/file" 

if ssh $HOST "test -e $FILE"; then 
    echo "File exists." 
else 
    echo "File does not exist." 
fi 

Y lo contrario, probar si un archivo no existe:

HOST="example.com" 
FILE="/path/to/file" 

if ! ssh $HOST "test -e $FILE"; then 
    echo "File does not exist." 
else 
    echo "File exists." 
fi 
Cuestiones relacionadas