3 votes

sftp renvoie le code 0 même s'il y a une erreur signalée "Couldn't create directory : Failure"

J'essaie d'écrire un script Bash chargé de créer un dossier sur un serveur distant.

Snippet :

!/bin/bash -e
echo "Creating remote folder."
echo mkdir test_folder | sftp -oPort=22 192.168.0.11:/tmp
if [[ $? != 0 ]]; then
  echo "Transfer failed!"
  exit 1
else
  echo "Transfer complete."
fi
echo $?

La sortie est :

Connected to 192.168.0.11.
Changing to: /tmp
sftp> mkdir test_folder
Couldn't create directory: Failure
Transfer complete.
0

Le code de retour est donc de 0, mais il y a manifestement eu une erreur.

Comment puis-je attraper l'erreur à distance et définir un code de retour approprié dans le script ?

7voto

Cyrus Points 890

Utilisez l'option de sftp -b (avec un fichier batch ou la substitution de processus de bash) et vous obtiendrez le code de retour de mkdir.

sftp -b <(echo "mkdir test_folder") user@remotehost:/
echo $?

Sortie :

Changing to: /
sftp> mkdir test\_folder
Couldn't create directory: Failure
1

ou utilisez ceci :

echo "mkdir test_folder" | sftp -b - user@remotehost:/
echo ${PIPESTATUS[1]}

De man sftp :

-b batchfile : Le mode batch lit une série de commandes depuis un fichier batch d'entrée au lieu de stdin. Comme il n'y a pas d'interaction avec l'utilisateur, il utilisateur, il doit être utilisé en conjonction avec une authentification non interactive. Un fichier batch de '-' peut être utilisé pour indiquer une entrée standard. sftp s'interrompra si l'une des commandes suivantes échoue : get, put, rename, ln, rm, mkdir, chdir, ls, lchdir, chmod, chown, chgrp, lpwd, df, symlink, et lmkdir. L'arrêt sur erreur peut être supprimé pour chaque commande commande en préfixant la commande par le caractère '-' (par exemple, -rm /tmp/blah*).

0voto

charkh Points 31

1) L'utilisation de la variable $ ? n'est pas correcte. Le problème est que vous devez stocker la valeur de retour ($ ?) immédiatement après avoir exécuté la commande sftp. Sinon, vous obtiendrez la valeur de retour d'une autre commande. Par exemple :

rm /directory_which/does_not_exists
echo $?
echo "Deleting directory ..."

est totalement différent de :

rm /directory_which/does_not_exists
echo "Deleting directory ..."
echo $?

2) Vous pouvez créer un répertoire distant en utilisant ssh comme suit

ssh username@192.168.0.11 "cd /tmp && mkdir test_folder"

J'espère que cela vous aidera...

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X