2011-10-21 1 views
1

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; 

Répondre

3

Besoin de plus d'échapper à obtenir ce travail. bash va évaluer les variables, etc. dans le fichier ici localement, puis le résultat de cela sera évalué sur le serveur distant.

En particulier, votre $myfile évalue probablement une chaîne vide lorsque le fichier ici est en cours d'évaluation, entraînant l'absence d'argument de fichier pour la statistique.

+1

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 –

+1

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

+1

@GordonDavisson: Correct. J'aurais dû être explicite que "vous avez besoin de plus d'échappement". :) – retracile

Questions connexes