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

je voudrais vérifier si un 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") 
27
demandé sur cerr 2012-10-11 21:29:15

10 réponses

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
26
répondu Florin Stingaciu 2018-04-28 21:57:19

en plus des réponses ci-dessus, il y a la manière abrégée 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é, un des avantages de ce type de test est que vous pouvez facilement remplacer le -f pour n'importe quel opérateur de test que vous aimez: -nt , -d , -s etc...

Opérateurs D'Essai: http://tldp.org/LDP/abs/html/fto.html

36
répondu JP Lew 2013-08-17 15:38:48

ne Peut pas faire plus simple que cela :)

ssh host "test -e /path/to/file"
if [ $? -eq 0 ]; then
    # your file exists
fi
17
répondu karni 2015-04-15 01:15:40

Vous êtes absent ; . La syntaxe générale, si vous le mettez dans une seule ligne:

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

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

[ n'est pas une syntaxe, c'est le programme test (cochez ls /bin/[ , il existe réellement, man test pour les docs – bien que peut également avoir une version intégrée avec des fonctionnalités différentes/supplémentaires.) qui est utilisé pour tester diverses conditions communes sur les fichiers et les variables. (Notez que [[ d'un autre côté est la 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. Alors essayez quelque chose comme:

if ssh user@host test -e "$file" ; then ... ; else ... ; fi
5
répondu Mat 2012-10-11 17:48:52

une ligne, citation correcte

ssh remote_host test -f "/path/to/file" && echo found || echo not found
5
répondu estani 2015-08-28 12:19:58
ssh -q $HOST [[ -f $FILE_PATH ]] && echo "File exists"

la commande ci-dessus 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
répondu None 2013-12-04 04:17:53

Test 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 le contraire, test 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
2
répondu rouble 2018-02-06 04:40:39

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

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

et faites attention à (simple-)citer les variables que vous souhaitez étendre par l'hôte distant; sinon l'extension des variables sera faite 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
}

Donc, pour vérifier si un fichier existe sur l'ordinateur distant, vous pouvez faire ce qui suit:

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
répondu tarok 2013-12-09 16:28:45

je voulais aussi vérifier si un fichier distant existe mais avec RSH. J'ai essayé les solutions précédentes mais elles n'ont pas fonctionné avec RSH.

enfin, j'ai fait fonction courte qui fonctionne bien:

function existRemoteFile ()
{
REMOTE=
FILE=
RESULT=$(rsh -l user $REMOTE  "test -e $FILE && echo \"0\" || echo \"1\"")
if [ $RESULT -eq 0 ]
then
    return 0
else
    return 1
fi
}
0
répondu miguialberto 2016-07-12 11:40:33

sur la machine CentOS, l'oneliner bash qui travaillait 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 réponse supérieure) ainsi que de guillemets autour de la commande à exécuter à distance.

0
répondu Abhimanu Kumar 2016-12-29 13:38:20