Je dois exécuter un script sur un serveur distant via ssh, je ne trouve pas le script en tant que fichier sur le serveur distant ni créer de fichiers pendant le script processus.Protégez le caractère lors de l'exécution d'un script en ligne sur un serveur distant avec ssh
Le script vérifie la présence d'un fichier inexistant ou d'un octet nul et, s'il existe, vérifie si le fichier est obsolète.
J'ai suivi a thread here on SO et essayé ceci:
myvar=$(ssh [email protected] <<EOF
myfile=/mnt/file.csv
if [ -s $myfile ]; then
filedate=$(stat -c %x $myfile|grep '[0-9\-]*' --max-count=1 -o);
yesterday=$(date --date 'now -1 day' --iso-8601);
if [ $filedate < $yesterday ]; then
echo '1 '$yesterday;
else
echo '0 ok';
fi
else
echo $(date --iso-8601);
fi
EOF
)
malheureusement, le tube semble être tronquer la chaîne ou quelque chose, parce que le script retourne
stat: too few arguments
peut-être juste ne peut pas utiliser « monfichier "déclaration de var. Aucune suggestion?
Merci d'avance.
---- Modifier: Éclaircir réponse:
keber-laptop:~ keberflores$ echo $myvar
keber-laptop:~ keberflores$ myvar=$(ssh [email protected] <<EOF
> myfile=/mnt/file.csv
> if [ -s \$myfile ]; then
> filedate=\$(stat -c %x \$myfile|grep '[0-9\-]*' --max-count=1 -o);
> yesterday=\$(date --date 'now -1 day' --iso-8601);
> if [ \$filedate < \$yesterday ]; then
> echo '1 '\$yesterday;
> else
> echo '0 ok';
> fi
> else
> echo '1 '\$(date --iso-8601);
> fi
> EOF
>)
Pseudo-terminal will not be allocated because stdin is not a terminal.
[email protected]'s password:
keber-laptop:~ keberflores$ echo $?
0
keber-laptop:~ keberflores$ echo $myvar
1 2011-10-22
---- Edit: appeler à l'intérieur perl:
my $myvar = qx'ssh [email protected] <<\'EOF\'
myfile=/mnt/file.csv
if [ -s $myfile ]; then
filedate=$(stat -c %x $myfile|grep \'[0-9\-]*\' --max-count=1 -o);
yesterday=$(date --date \'now -1 day\' --iso-8601);
if [ $filedate < $yesterday ]; then
echo \'1 \'$yesterday;
else
echo \'0 ok\';
fi
else
echo \'1 \'$(date --iso-8601);
fi
EOF
';
print $myvar;
Il n'y a pas que les variables, le '$ (stat ...)' et tout ce qui est en cours d'exécution sur l'ordinateur local. Echapper des caractères '$' (c'est-à-dire 'filedate = \ $ (stat -c% x \ $ monfichier | ...') devrait le résoudre.Vous pouvez tester en remplaçant 'myvar = $ (ssh user @ server' par' cat '(et supprimer la parenthèse de fermeture finale), et il va imprimer les commandes comme ils seraient envoyés à l'ordinateur distant –
essayez d'exécuter le script et changer le shebang à: #/bin/bash -x pour voir ce qui se passe sur, il affichera la sortie des variables, et si les conditions sont remplies – Kevin
@GordonDavisson: Correct. J'aurais dû être explicite que "vous avez besoin de plus d'échappement". :) – retracile