Enchaînement commande sftp

Bonjour, je suis novice en linux.

Pour tout vous expliquer, je suis sous Windows 7 et me connecte via Putty en SSH, sur un serveur teste (192.168.X.X) qui est sous Debian Wheezy (comme tous les autres serveurs).

Je dois créer un script shell qui doit aller chercher, en sftp, sur un serveur distant (5.X.X.X), des fichiers et qui les transfert vers plusieurs autres serveurs dont je ne connait ni le nombre, ni les IP. Pour l’instant, je les envoi vers mon 192.168.X.X. Ces fichiers sont des fichiers de mises à jour de l’OS des serveurs.
Mon script shell doit donc permettre de récupérer des fichiers en sftp et de les télécharger -> Mise à jour automatique des OS des différents serveurs.

J’ai fait mon script, la connexion en sftp fonctionne mais ensuite, il ne m’enchaîne pas les commandes (celles-ci fonctionnent puisque quand je les tape manuellement, elles fonctionnent).

Si quelqu’un pouvait m’aider et m’expliquer pourquoi il ne m’enchaîne mes commandes !

J’espère avoir été assez claire.
Merci d’avance.

PS : Je vous met mon script. L’indentation ne passe pas lors de l’affichage sur ce site.

#! /bin/sh

sftp comptage@5.X.X.X
if [ $? = 0 ] ; then
echo "TRANSFERT FICHIERS"
get /var/ftproot/comptage/MAJ/. /var/MAJ #fichiers réceptionnés sur le 192.168.X.X (ici : variable pour reconnaître IP)
rm /var/ftproot/comptage/MAJ/.
exit
else
echo "ERREUR CONNEXION"
if [ $(df / | grep -v Taille | awk ‘{print $5}’ | sed -e “s/%//”) -ge 80 ] ; #si occupation de l’espace disque supérieur à 80 %
then
echo "ESPACE DISQUE INSUFFISANT"
else
echo "INSTALLATION"
apt-get install ssh
sftp comptage@5.196.X.X
get /var/ftproot/comptage/MAJ/. /var/MAJ #fichiers réceptionnés sur le 192.168.X.X (ici : variable pour reconnaître IP)
rm /var/ftproot/comptage/MAJ/.
exit
fi
fi

Hello,

Tu peux mettre ton code entre balise [ code] ?

C’est normal que ça marche pas car quand tu lances la commande sftp de ton script il attends des commandes dans l’entrée standard.

Tu peux essayer avec ça :

sftp comptage@5.196.X.X <<EOF get /var/ftproot/comptage/MAJ/*.* /var/MAJ #fichiers réceptionnés sur le 192.168.X.X (ici : variable pour reconnaître IP) rm /var/ftproot/comptage/MAJ/*.* exit EOF

Merci ça a fonctionné. Par contre, je ne peux plus passer de if pour savoir si la connexion c’est bien faite ?

if connexion OK ; then
transfert fichiers
else
echo "ERREUR CONNEXION"
fi

De plus, je voulais aussi mettre un if pour savoir si openssh-client ou server (je confond les 2) était installé et si non, vérifier la place restante sur le disque et si elle est inférieure à 80 %, dire que l’espace disque est insuffisant pour l’installation. Si oui, enchaîner sur le if connexion OK, alors…

contexte ? Tu peux fournir ce que tu voulais faire ?

pour openssh-client :

if [[ ! $(dpkg -l openssh-client 2> /dev/null) ]] then apt-get -y openssh-client fi

Voilà mon code actuel en entier.

#######! /bin/sh

#######IP=$(ifconfig eth0 | grep “inet adr” | cut -f2 -d: | awk ‘{ print$1 }’)
SERVICE=$(dpkg -s openssh-client | grep Status)

if [ $SERVICE -gt 0 ]
then
sftp comptage@5.X.X.X <<EOF
get /var/ftproot/comptage/MAJ/. /var/MAJ
####### rm /var/ftproot/comptage/MAJ/.
exit
EOF
else
if [[ ! $(dpkg -l openssh-client 2> /dev/null ) ]]
then
apt-get install openssh-client
sftp comptage@5.X.X.X <<EOF
get /var/ftproot/comptage/MAJ/. /var/MAJ
####### rm /var/ftproot/comptage/MAJ/.
exit
EOF
else
echo "ERREUR"
fi
fi

Par contre voilà le message d’erreur qu’il m’affiche:

/dos/s-dos/fichier.sh: 26: /dos/s-dos/fichier.sh: Syntax error: end of file unexpected (expecting “fi”)

PS : mon code s’affiche très mal

S’il vous plaît, redonnez votre code en mettant un balisage adapté, c’est-à-dire :

  • Une ligne ne contenant que 3 caractères backticks AltGR+7

  • Votre code

  • une balise de fin ( comme la balise de début 3 x AltGR+7 )

Cordialement,
Regards,
Mit freundlichen Grüssen,
مع تحياتي الخالصة

F. Petitjean
If you have a procedure with 10 parameters, you probably missed some.
Alan J. Perlis

#! /bin/sh

#IP=$(ifconfig eth0 | grep "inet adr" | cut -f2 -d: | awk '{ print$1 }')

SERVICE=$(dpkg -s openssh-client | grep Status)

if [ $SERVICE = 0 ]
then
    sftp comptage@5.X.X.X << EOF 
    get /var/ftproot/comptage/MAJ/*.* /var/MAJ
    # rm /var/ftproot/comptage/MAJ/*.*
    exit
    EOF
else
      if [[ ! $(dpkg -l openssh-client 2> /dev/null ) ]]
      then
           apt-get install openssh-client
           sftp comptage@5.X.X.X << EOF 
           get /var/ftproot/comptage/MAJ/*.* /var/MAJ
           # rm /var/ftproot/comptage/MAJ/*.*
            exit
            EOF
       else
             echo "ERREUR"
       fi
fi

Merci pour l’astuce !
Pour rappel, je veux dire que :

if service openssh-client exist
then
      sftp comptage@5.X.X.X << EOF
      get /var/ftproot/comptage/MAJ/*.* /var/MAJ
      # rm /var/ftproot/comptage/MAJ/*.*
      exit 
      EOF
else
       if utilisation espace disque < 80 %
       then
            apt-get install openssh-client
            sftp comptage@5.X.X.X << EOF 
            get /var/ftproot/comptage/MAJ/*.* /var/MAJ
            # rm /var/ftproot/comptage/MAJ/*.*
            exit
            EOF
        fi
fi

Les lignes ‘EOF’ doivent être alignées à gauche.

Recherchez ‘here document’ dans les documentations relatives au shell.

Cordialement,
Regards,
Mit freundlichen Grüssen,
مع تحياتي الخالصة

F. Petitjean
Noël au scanner, Pâques au cimetière… (Desproges)

J’ai connu bien des filles de joie qui avaient pour père un homme de peine.
– Alphonse Allais

Cette partie là fonctionne mais dès que j’ajoute des if…then…else…fi, il m’affiche ce message là :

/dos/s-dos/fichier.sh: 30: /dos/s-dos/fichier.sh: Syntax error: end of file unexpected (expecting “fi”)

Et si je rajoute des @ devant les if, des “” après les then et else et des "; " après les commandes, il m’affiche :

/dos/s-dos/fichier.sh: 9: /dos/s-dos/fichier.sh: Syntax error: word unexpected (expecting “)”)

Cela fait n’importe quoi, en tout cas rien qu’on puisse deviner. Mais où diable avez-vous vu qu’on pouvait écrire “@if” à la place de if ?

Je commencerais par enlever l’espace entre le ‘#!’ et le chemin de l’interpréteur.
D’autre part, sous Debian l’interpréteur ‘/bin/sh’ par défaut est ‘dash’ qui est compatible avec ‘bash’, certes, mais plus contraignant. La syntaxe du shell ‘bash’ est déjà suffisamment complexe comme cela, je mettrais le script au point avec ‘#!/bin/bash’ d’abord, pour ensuite peaufiner en enlevant les bashismes :smile:

Je vous conseille d’utiliser des fonctions et de ne pas mélanger les torchons et les serviettes.
Une fonction pour vérifier que la commande sftp est là.
Une fonction pour récupérer l’utilisation d’un système de fichiers.

Exemple, pas testé :wink: (widget édition du forum inutilisable)

PKG=openssh-client
has_sftp() {
   pth=$(which sftp)
    rc=$?
    if [ $rc != 0 ]; then
        echo "please install $PKG"
         exit 1
   fi
}
perc_util() {
   #  res=$(perc_util /var); echo $res ==> 41
   fs=$1
   perc=$(df "$fs" | tail -1 | awk '{ print $5}')
    echo ${perc/'%'/''}
}

has_sftp
DEST=/var/MAJ
util=$(perc_util $DEST)
if (( $util <  80 ))
then
    echo "espace insuffisant sur $DEST"
    exit 2
fi 

Cordialement,
Regards,
Mit freundlichen Grüssen,
مع تحياتي الخالصة

F. Petitjean
« On ne perd pas son temps en aiguisant ses outils. »
Proverbe français

En testant, il m’affiche 2 messages d’erreur :

/dos/s-dos/fichier.sh: 17: /dos/s-dos/fichier.sh: Bad substitution
/dos/s-dos/fichier.sh: 23: /dos/s-dos/fichier.sh: cannot open 80: No such file

Par contre puis-je ajouter une variable $IP ? D’après ce que j’ai fait ça n’a pas l’air de marcher.

#IP=$(ifconfig eth0 | grep "inet adr" | cut -f2 -d: | awk '{ print$1 }')
sftp comptage@5.X.X.X << EOF 
get /var/ftproot/comptage/MAJ/*.* root@$IP:/var/MAJ
# rm /var/ftproot/comptage/MAJ/*.*
exit
EOF

Si la variable IP n’est pas initialisée (ligne en commentaire dans ton code) ça ne peut pas fonctionner.

Il me trouve bien la bonne IP, mais il ne veut pas se connecter au root@192.168.X.X. Je la met en commentaire quand je ne met pas root@$IP dans ma commande get

IP=$(ifconfig eth0 | grep "inet adr" | cut -f2 -d: | awk '{ print$1 }')
sftp comptage@5.X.X.X << EOF 
get /var/ftproot/comptage/MAJ/*.* root@$IP:/var/MAJ
# rm /var/ftproot/comptage/MAJ/*.*
exit
EOF

De plus, j’ai réussi à corriger l’erreur de “bad substitution” en mettant bash au lieu de sh dans le #!/bin/bash

Up, merci !

Re
Mon script fonctionne en bash et en sh . Par contre est-il possible d’insérer une variable qui me donnerait l’adresse IP du serveur destinataire ? Envoi vers plusieurs serveurs dont je ne connais ni le nombre, ni les IP.

Voilà mon script :

#IP=$(ifconfig eth0 | grep "inet adr" | cut -f2 -d: | awk '{ print$1 }')

sftp comptage@5.X.X.X <<EOF
        get /var/ftproot/comptage/MAJ/*.* root@$IP:/var/MAJ
#       rm /var/ftproot/comptage/MAJ/*.*
#       exit
EOF

Lors de mes essais ça n’avait pas l’air de marcher, mais je m’y prend peut-être mal.
PS : ce n’est pas moi qui mettrait en place le script. Je ne fais que l’écrire et le tester sur un serveur test