Script sh avec try et catch [Résolu]

Signaler
Messages postés
7
Date d'inscription
lundi 5 octobre 2020
Statut
Membre
Dernière intervention
14 octobre 2020
-
Messages postés
29321
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
14 octobre 2020
-
Bonjour la communauté,
Voila je suis bloqué sur la création d'une boucle sh avec du "try catch", mais vu qu'il n'y a pas ces boucles sur sh, j'aimerai faire un truc similaire :
En gros, je provisionne une nouvelle VM chez un provider cloud, par contre le temps que ça charge (que je ne pourrais pas exactement savoir) il faut que cette boucle ssh se répète jusqu'à ce que le service soit démarré (avec par exemple une attente de 5 secondes entre chaque réexécution)
Donc voila en gros c'est comme si c'était équivalent à :

while true {
try {
"ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no root@$var <<EOF
sudo -su root
apt-get update
apt-get install -y net-tools
EOF"}
end

catch {
"sleep 5"
end}
}
Enfin j'ai juste la structure en place mais ça pourrait être un petit peu différent
Merci !

3 réponses

Messages postés
29321
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
14 octobre 2020
6 941
Bonjour,

Tu peux juste vérifier le code de retour de la dernière commande
apt 
(le code de la dernière commande shell lancé est stocké dans la variable
$?
, et vaut
0
si et seulement si tout s'est bien passé). En fonction de cette valeur, tu décides ou non ta boucle
while
.

Bonne chance
Messages postés
7
Date d'inscription
lundi 5 octobre 2020
Statut
Membre
Dernière intervention
14 octobre 2020

Bonjour @mamiemando et merci d'avoir répondu
Le problème c'est plutôt la commande ssh pas apt, donc je ne sais pas comment avoir le code d'erreur
Merci
Messages postés
29321
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
14 octobre 2020
6 941
Bonjour,

Quelques explications

La variable
$?


Voici un exemple qui sera peut être plus parlant (en gras, c'est mon invite de commande, donc ça ne fait pas partie de la commande), dans lequel je déclenche des commandes via ssh vers ma propre machine (
localhost
) avec mon login (
mando
) :

(mando@silk) (~) $ ssh mando@localhost touch /tmp/toto
mando@localhost's password:

(mando@silk) (~) $ echo $?
0

(mando@silk) (~) $ ssh mando@localhost touch /root/toto
mando@localhost's password:
touch: impossible de faire un touch '/root/toto': Permission non accordée

(mando@silk) (~) $ echo $?
1


Comme tu peux le voir, selon que la commande passé via
ssh
marche ou non, le code de retour
$?
vaut soit
0
(si tout va bien), une autre valeur sinon. La valeur de retour correspond aux spécifications de la commande passée à
ssh
(ici
touch
, qui sert à créer un fichier vide). Les valeurs de retour sont spécifiées dans la documentation de la commande (ici, voir
man touch
pour plus de détails).

Script

Dans un script, voici à quoi ça peut ressembler (appelons disons
toto.sh
) :

#!/bin/sh
  
for filename in /tmp/toto /root/toto
do
    ssh mando@localhost touch $filename
    if [ $? -eq 0 ]; then
        echo "$filename :)"
    else
        echo "$filename :("
    fi
done
exit 0


... ce qui donne :

(mando@silk) (~) $ chmod a+x toto.sh

(mando@silk) (~) $ ./toto.sh
mando@localhost's password:
/tmp/toto :)
mando@localhost's password:
touch: impossible de faire un touch '/root/toto': Permission non accordée
/root/toto :(


Compléments

Pour éviter d'avoir à saisir le mot de passe à chaque fois, il est recommandé d'installer une clé ssh sur le compte cible (dans cet exemple,
mando@localhost
e.g. avec la commande
ssh-copy-id
), et de lancer la commande
ssh-add
avant de lancer le script
toto.sh
. Pour plus de détails, je t'invite à regarder un tutoriel sur les clés ssh.

Bonne chance
Messages postés
7
Date d'inscription
lundi 5 octobre 2020
Statut
Membre
Dernière intervention
14 octobre 2020

Merci beaucoup à vous !!
C'est très bien expliqué, en effet la commande $? retourne 0 quand la dernière commande a bien été effectuée
Messages postés
29321
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
14 octobre 2020
6 941 >
Messages postés
7
Date d'inscription
lundi 5 octobre 2020
Statut
Membre
Dernière intervention
14 octobre 2020

De rien et merci du compliment :-) Bonne continuation !