web-dev-qa-db-fra.com

vérifier si le fichier existe sur l'hôte distant avec ssh

Je voudrais vérifier si un certain fichier existe sur l'hôte distant. J'ai essayé ceci:

$ if [ ssh user@localhost -p 19999 -e /home/user/Dropbox/path/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") 
31
stdcerr

Voici une approche simple:

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

fi
37
Florin Stingaciu

En plus des réponses ci-dessus, il existe un moyen abrégé de le faire:

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

-q est un mode silencieux, il supprimera les avertissements et les messages.

Comme @Mat l'a mentionné, l'un des avantages des tests comme celui-ci est que vous pouvez facilement échanger le -f pour tout opérateur de test que vous aimez: -nt, -d, -s etc...

Opérateurs de test: http://tldp.org/LDP/abs/html/fto.html

40
JP Lew

Rien de plus simple que ça :)

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

une ligne, citation appropriée

ssh remote_Host test -f "/path/to/file" && echo found || echo not found
9
estani

Tu manques ;s. La syntaxe générale si vous mettez tout cela sur une seule ligne serait:

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

thing peut être à peu près tout ce qui renvoie un code de sortie. La branche then est prise si cette thing renvoie 0, la branche else sinon.

[ n'est pas une syntaxe, c'est le programme test (consultez ls /bin/[, il existe réellement, man test pour les documents - mais peut également avoir une version intégrée avec des fonctionnalités différentes/supplémentaires.) qui est utilisée pour tester diverses conditions courantes sur les fichiers et les variables. (Notez que [[ d'autre part est syntaxe et est géré par votre Shell, s'il le supporte).

Pour votre cas, vous ne voulez pas utiliser test directement, vous voulez tester quelque chose sur l'hôte distant. Essayez donc quelque chose comme:

if ssh user@Host test -e "$file" ; then ... ; else ... ; fi
5
Mat

Testez si un fichier 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

Et au contraire, testez si un fichier n'existe pas:

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

if ! ssh $Host "test -e $FILE"; then
    echo "File does not exist."
else
    echo "File exists."
fi
3
rouble
ssh -q $Host [[ -f $FILE_PATH ]] && echo "File exists"

Ce qui précède exécutera la commande echo sur la machine à partir de laquelle vous exécutez la commande ssh. Pour que le serveur distant exécute la commande:

ssh -q $Host "[[ ! -f $FILE_PATH ]] && touch $FILE_PATH"
3
None

Vous pouvez spécifier le Shell à utiliser localement par l'hôte distant.

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

Et soyez prudent de (simple-) citer les variables que vous souhaitez développer par l'hôte distant; sinon l'expansion variable sera effectuée par votre 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
}

Ainsi, pour vérifier si un certain fichier existe sur l'hôte distant, vous pouvez effectuer les opérations suivantes:

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
1
tarok

Sur la machine CentOS, le bash oneliner qui a fonctionné pour moi était:

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

Il avait besoin d'une redirection d'E/S (comme première réponse) ainsi que de guillemets autour de la commande à exécuter à distance.

0
Abhimanu Kumar

Je voulais aussi vérifier si un fichier distant existe mais avec RSH. J'ai essayé les solutions précédentes mais elles ne fonctionnaient pas avec RSH.

Enfin, j'ai fait une fonction courte qui fonctionne très 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
miguialberto