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")
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 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
Rien de plus simple que ça :)
ssh Host "test -e /path/to/file"
if [ $? -eq 0 ]; then
# your file exists
fi
une ligne, citation appropriée
ssh remote_Host test -f "/path/to/file" && echo found || echo not found
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
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
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"
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
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.
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
}