Shell et Code retour d'une commande ftp

glwadys -  
 Anonymous -
Bonjour à tous,

Je suis nouvelle sur le forum et en développement UNIX et j'aimerai avoir votre aide.
Je travaille sur une script sous ksh qui effectue un ftp et j'ai besoin d'alerter l'utilisateur au cas où le transfert de fichier ne s'effectue pas correctement (par exemple impossibilité de se connecter en ftp à la machie distante).
Mon problème est que la variable d'environnement considère apparement le code retour du EOF et non pas celui du FTP.
Comment recupérer le code retour de la fonction ftp. Mon code est décrit ci-après; même quand la connection echoue, le message transfert ok s'affiche:

ftp -in ${PILMARGE_SERVEUR} << EOF
user ${SC_ALIAS_LOGIN} ${SC_ALIAS_PWD}
bin
cd ${PILMARGE_DIR}
put ${PIL_DATA_SEND}/ps_affaire_t1.csv ps_affaire_t1.csv

EOF
CR=$?
case $CR in
0) msglog ${PIL_LOG_NIV1} 0 0122 "Fin de transfert FTP correct"
;;
*) msglog ${PIL_LOG_NIV1} 3 3122 "ERREUR $CR lors du transfert FTP - Arret du traitement"
;;

Merci pour votre aide
esac
Configuration: PC/UNIX

5 réponses

  1. Steff
     
    Bonjour,

    Sans passer par un fichier intermédiaire (exemple pour création d'un répertoire) :

    # Commande ftp pour création répertoire avec récupération affichage dans variable
    (à écrire dans un script)

    ret_ftp=`ftp -u nom_machine << FIN_DIR

    user nom_user password_user

    verbose

    cd rep_virtuel (facultatif)

    mkdir nom_rep

    FIN_DIR`

    # Analyse si création répertoire ok ou non

    if echo $ret_ftp|grep "directory created" > /dev/null
    then
    echo "Creation ok"
    else
    echo "Creation ko"
    fi
    5
    1. crapoulou Messages postés 28002 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   8 046
       
      Salut,
      5 ans après... pourquoi pas ;-D
      0
    2. Keuronde
       
      Ça m'a aidé !
      Merci
      0
  2. zx6r
     
    j ai trouve l astuce suivante :

    - recupere les status du mode verbose dans un fichier
    - tester si le transfert c est bien deroulé (status 266)

    ftp -n $SERVER > rapport 2>rapport_err <<fin
    quote user $USER
    quote pass $USERMDP
    verbose
    cd /tmp
    put $FICHIER
    bye
    fin

    result=`cat rapport|grep 226|wc -l`
    echo $result
    if [ $result = '0' ]
    then
    echo "Erreur de transfert"
    else
    echo "Transfert termine"
    fi
    2
  3. hssissen Messages postés 844 Date d'inscription   Statut Membre Dernière intervention   50
     
    Une façon de faire (existe +ieurs) est de rediriger si problemes vers un fichiers du genre:

    ftp -n $HOST > /tmp/ftp.ok 2> /tmp/ftp.no <<fin
    bla bla ...
    fin
    # etat de sortie
    EXITSTATUS=$?

    if [ $EXITSTATUS != "0" ]
    then
    # message_erreur
    fi
    1
    1. glwadys
       
      Bonjour

      Merci pour ta réponse.

      Lorsque je fais ainsi (recupération du code erreur avec CR=$? ) le message qui s'affiche est toujours OK même lorsque la connection ftp échoue. (Je suppose que la variable d'environnement dans ce cas contient le code de retour de EOF... ?).
      Par contre, je vais utiliser ton idée et tester si le fichier ftp.no a une taille nulle.
      0
      1. hssissen Messages postés 844 Date d'inscription   Statut Membre Dernière intervention   50 > glwadys
         
        Tu peux encore essayer avec ncftpput (fourni avec ncftp) et tu fais:

        #!/bin/sh

        ncftpput -u user -p pass $HOTE /REP_DISTANT /REP_LOCAL/ton_script.sh

        if [ "$?" = "0" ] ; then
        echo "OK"
        else
        echo "NOK"
        fi

        Ça devrait marcher avec ça. L'inconvénient c'est qu'avec le ncftpput il faut transférer un répertoire entier, du coup, tu dois ouvrir autant de connexion que de fichiers à transferer. C'est pas pratique, à moins que tu regroupe le moins possible de fichiers a transférer dans un reprtoire, car le temps de connexion sera d'autant plus lent que le nbre de fichiers a transferer est plus grand!
        0
      2. glwadys > hssissen Messages postés 844 Date d'inscription   Statut Membre Dernière intervention  
         
        Bonjour,

        J'ai lu le man du ncftpput et si j'ai bien compris c'est pour le transfert des scripts?
        Je vais essayer la seconde solution.

        Merci pour ta réponse
        0
      3. hssissen Messages postés 844 Date d'inscription   Statut Membre Dernière intervention   50 > glwadys
         
        Autre alternative (celle-là je ne l'ai pas essayé!):

        lftp -e 'cd /; mput toto; exit' ftp://toto:toto@localhost/; echo $?
        0
  4. crabs Messages postés 909 Statut Membre 507
     
    Salut,
    Le status de ftp n'est pas représentatif de la réussite ou pas des commandes
    ftp. Pour cela il faut analyser les réponses et en particulier les codes de
    réponses 550, 200, 120, etc...
    Mon client ftp, si il arrive à contacter le serveur ftp, retourne toujours
    succès même si le login se passe mal.
    Pour connaître la signification des codes et essayer de savoir si tout est ok
    se reporter à la RFC de FTP (en anglais) et en particulier le chapitre 4.2 :
    http://www.faqs.org/rfcs/rfc959.html
    1
    1. glwadys
       
      Bonjour

      Merci pour ta réponse.
      En lisant le lien j'en ai appris plus sur le protocole FTP. Toutefois, j'aurais une question (qui semblera peut être stupide) : comment recupérer le code de retour du FTP?
      0
    2. crabs Messages postés 909 Statut Membre 507
       
      Salut,
      J'ai testé sous Linux (slackware 10.1), le $? vaut toujours 0, même si le
      serveur n'existe pas ...
      Pour l'analyse ses codes de retour des commandes ftp, il faut analyser la sortie
      standard du processus et rechercher ces fameux codes et vérifier qu'ils
      correspondent bien à ce que tu attends. Là il faut jouer avec du grep, du awk
      ou du perl.

      Y a peut-être les commandes ncftpget et ncftpput qui donnent un status ($?)
      plus exploitable.
      A+, crabs
      0
    3. Anonymous
       
      Crabs le $? vaut toujours 0-1 même si le serveurs n'existe pas. Puis le mieux c'est qu'il faut jouer avec du PERL. Car le GREP et le AWK ce n'est pas trop pareil que le PERL. Et oui il y a d'autre commande ncftpget et ncftpput qui donne ce statut suivant : ===< ($.?) Encodage Perl ou PAA2*c cela restera le mieux. Ou sinon tu peux toujours créer un Shell code Polymorphique.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. glwadys
     
    Merci pour votre aide.

    Je ne pouvais modifier tout mon code donc j'ai gardé la première solution pour récuperer les éventuelles erreurs rencontrées et faire le test.
    1