Sortie code de statut pour Attendre script appelé à partir de Bash
J'ai fait un script Bash qui utilise un script expect pour automatiser les connexions ssh.Le script se connecte à plusieurs serveurs et exécute des commandes.
Le script bash invites pour les références de connexion à la fois.
Je veux intégrer une fonction où le script s'arrête si la connexion échoue pour la première serveur pour éviter le script de vérification pour la prochaine serveurs résultant dans le compte d'utilisateur s'enfermer. Le verrouillage de compte qui se passe pour les 3 jours d'échecs de connexion et le nombre de serveur le script tente de se connecter est de plus de 3.
C'est l'extrait de code dans le script bash qui appelle le script expect.
countu=0
for servername in $(cat $linux_host_list)
do
./script.expect $LUSERNAME $LPASS $servername Linux >> linux_log_file.txt & < /dev/null
let countl=countl+1
done
et voici le script expect (script.expect
) extrait de
#!/usr/bin/expect -f
set timeout 30
set username [lindex $argv 0]
set SPASS [lindex $argv 1]
set servername [lindex $argv 2]
set case [lindex $argv 3]
set prompt "(%|#|\$|%\]) $"
switch $case {
Linux {
log_user 0
spawn ssh -o StrictHostKeyChecking=no $username@$servername
expect {
"assword:" {
send "$SPASS\r"
expect -re "$prompt"
}
expect -re "$prompt"
}
send "sudo su -\r"
expect {
"assword:" { send "$SPASS\r" }
}
expect -re "$prompt"
log_user 1
send "opcagt -status ; opctemplate -l ; cat watch.cf 2> /dev/null\r"
expect -re "$prompt"
log_user 0
send "exit\r"
expect -re "$prompt"
log_user 1
}
J'ai essayé de saisir le bash de commande de sortie ($?
) en supposant que la commande bash serait de retour d'un pas égal à zéro si la connexion échoue pour mot de passe incorrect dans le script expect mais qui n'a pas fonctionné.
Toutes les suggestions seront très appréciés.
Vous devez vous connecter pour publier un commentaire.
Pour la vérification des erreurs dans un script expect, il y a un décent exemple à http://systeminetwork.com/article/handle-errors-expect-scripts
Ce que vous devez faire est quelque chose comme ceci:
Je suppose que vous n'avez pas besoin de connaître le statut de sortie de la "opcagt ..." série de commandes (vous voulez juste pour voir le contenu de la montre.cf fichier. Si vous vous souciez, vous aurez besoin pour obtenir le shell pour vous dire:
Vous devriez sérieusement de prendre un coup d'oeil à Tissu.
La section:
Semble hautement suspect pour moi. En particulier, je voudrais vraiment s'attendre à ce que à cause des choses à devenir confus. Plus idiomatique de l'écriture qui serait:
Vous êtes en cours d'exécution le fait de s'attendre scripts en arrière-plan (
&
), de sorte que vous ne pouvez pas avoir les résultats de la première avant de continuer.La façon dont votre script expect est écrit, il va avoir un délai d'attente de 30 secondes lors de la deuxième invite de mot de passe si le premier mot de passe échoue. Au lieu de cela, vous pourriez faire un
expect
alternative, pour voir si vous obtenez un autreassword
invite, et le quitter immédiatement.Puis modifiez le script shell de ne pas mettre les attendent des appels dans le fond, au lieu de capturer la sortie avec
$?
et de le tester.Je ne suis pas beaucoup plus dans les scripts et tout, donc je ne peux pas écrire les étapes exactes ou un script pour prouver ce que j'ai à l'esprit - bien vouloir excuser
Bien, j'ai lu que bash fournit pour un truc qui s'appelle comme le statut de sortie
Un statut de sortie est à l'état 0 pour vrai et 1 ou quoi que ce soit d'autre pour faux
Vous pouvez le voir par l'exécution d'une commande et ensuite vérifier son état de sortie en tapant la commande "echo $?"
Ce que je suggère, c'est quand vous essayez de faire un ssh sur un serveur et l'authentification échoue, il doit y avoir un statut de sortie de quelque chose d'autre que 0
Obtenir un if-then-else boucle ici et vérification de l'état pour les 0 pour l'exécution du script et une autre valeur pour quitter le script totalement, avec un message d'erreur