Obtenir le code retour de la commande SFTP

J’ai l’extrait ci-dessous dans mon script ksh. Est-il possible que je puisse avoir un code de retour si le sftp a été exécuté avec succès et copié les fichiers de la source vers la destination cible?

echo "sftp start" >> /test/logfile.log sftp user@server <> /test/logfile.log cd /tgt/files lcd /src/files rm *.csv put -p *.csv exit EOF echo "sftp end" >> /test/logfile.log 

Ce que je ferais:

 echo "sftp start" >> /test/logfile.log sftp user@server <> /test/logfile.log cd /tgt/files lcd /src/files rm *.csv put -p *.csv exit EOF exit_code=$? if [[ $exit_code != 0 ]]; then echo "sftp error" >&2 exit 1 fi echo "sftp end" >> /test/logfile.log 

Au lieu d’utiliser sftp et d’écrire autant de commandes intermédiaires pour vous déplacer dans les dossiers appropriés, supprimer des fichiers, etc. avant votre transfert, vous pouvez utiliser les commandes suivantes de la manière suivante:

 echo "file transfer started" >> /test/logfile.log ssh user@server 'rm /tgt/files/*.csv' >> /test/logfile.log 2>&1 && scp /src/files/*.csv user@server:/tgt/files/ >> /test/logfile.log 2>&1 rc=$? if [[ $rc != 0 ]]; then echo "ERROR: transfer failed" >> /test/logfile.log exit 1 fi echo "file transfer completed" >> /test/logfile.log 

Explications:

ssh user@server 'rm /tgt/files/*.csv' >> /test/logfile.log 2>&1 && scp /src/files/*.csv user@server:/tgt/files/ >> /test/logfile.log 2>&1 si les fichiers sont correctement supprimés du dossier cible uniquement et uniquement ( && ), le transfert sera effectué !! Les erreurs intermédiaires sont également redirigées vers les fichiers journaux de sortie.

La solution de Gilles Quenot ne fonctionnera qu’avec les trois améliorations suivantes. Sans ces améliorations, le statut de sortie sera toujours 0 quel que soit le résultat des commandes sftp.

  1. Option sftp -b - doit être ajouté à la commande sftp. Alors seulement, sftp sortira avec le statut 1 si une commande sftp se passe mal. Sinon, le statut de sortie est toujours 0.

  2. J’ai ajouté 2>&1 | tee 2>&1 | tee pour enregistrer aussi les erreurs (redirige stderr vers stdout)

  3. Vous devez utiliser ${PIPESTATUS[0]} pour lire le statut de sortie de sftp. $? donne le statut de sortie de la dernière commande et c’est la redirection vers le fichier journal.

 echo "sftp start" >> /test/logfile.log sftp -b - user@server <&1 | tee /test/logfile.log cd /tgt/files lcd /src/files rm *.csv put -p *.csv exit EOF exit_code=${PIPESTATUS[0]} if [[ $exit_code != 0 ]]; then echo "sftp error" >&2 exit 1 fi echo "sftp end" >> /test/logfile.log 

Cordialement, Maarten