Comment vérifier si des erreurs se sont produites pendant ssh?

8

J'écris un script de déploiement et je dois annuler si des erreurs se sont produites.

Par exemple:

#!/bin/bash
ssh myapp '
    mkdir /some/dir
    # check if above command failed, and execute rollback script if needed
'
# or maybe do it from here?

En ce moment, lorsque j'exécute ce script, si mkdir échoue, il l'imprime sur mon écran et continue son exécution. Je dois attraper cette erreur et faire quelque chose.

ChocoDeveloper
la source

Réponses:

6

L'état de sortie de sshsera l'état de sortie de la commande à distance. Par exemple

ssh myapp 'exit 42'
echo $?

devrait imprimer 42 ( $?est l'état de sortie de la dernière commande exécutée).

Une option consiste à quitter immédiatement en cas d' mkdiréchec:

ssh myapp 'mkdir /some/dir || exit 42; do-more-stuff'
if [[ $? = 1 ]]; then
   echo "Remote mkdir failed"
fi

Il est probablement préférable d'essayer de gérer les échecs à distance dans votre script, si possible.

chepner
la source
5

Si vous avez vraiment besoin d'attraper le message d'erreur, vous pouvez essayer ceci:

#!/bin/bash
result=`ssh myapp 'mkdir /some/dir' 2>&1`
if [[ -n $result ]]; then
    echo "the following error occurred: $result"
fi

Par cela, vous redirigez la sortie d'erreur standard vers la sortie standard et enregistrez la sortie de la commande ssh dans $result. Si vous avez juste besoin du code d'erreur / de l'état de sortie, consultez cette réponse .

speakr
la source