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")
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
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
ne Peut pas faire plus simple que cela :)
ssh host "test -e /path/to/file"
if [ $? -eq 0 ]; then
# your file exists
fi
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
une ligne, citation correcte
ssh remote_host test -f "/path/to/file" && echo found || echo not found
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"
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
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
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
}
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.