GNU/Linux >> Tutoriels Linux >  >> Linux

Comment obtenir le code de sortie du processus généré dans le script shell attendu ?

Vous obtenez le statut de sortie du processus généré avec le wait commande :

expect <<'END'
log_user 0
spawn sh -c {echo hello; exit 42}
expect eof
puts $expect_out(buffer)

lassign [wait] pid spawnid os_error_flag value

if {$os_error_flag == 0} {
    puts "exit status: $value"
} else {
    puts "errno: $value"
}
END
hello

exit status: 42

À partir de la page de manuel attendue

attendez [args]

retarde jusqu'à ce qu'un processus engendré (ou le processus en cours si aucun n'est nommé) se termine.

attendez renvoie normalement une liste de quatre entiers. Le premier entier est le pid du processus qui a été attendu. Le deuxième entier est l'identifiant de spawn correspondant. Le troisième entier est -1 si une erreur du système d'exploitation s'est produite, ou 0 sinon. Si le troisième entier était 0, le quatrième entier est l'état renvoyé par le processus généré. Si le troisième entier était -1, le quatrième entier est la valeur de errno définie par le système d'exploitation. La variable globale errorCode est également définie.

Modifier

expect {
"INVALID "  { exit 4 }
timeout     { exit 4 }
}

à

expect {
    "INVALID "  { exit 4 }
    timeout     { exit 4 }
    eof
}

Ajoutez ensuite le lassign et if commandes.


Avec l'aide de Glenn, j'ai trouvé la solution... et mon script final est : :

attendre que le script soit

 [Linux Dev:anr ]$ cat testexit.sh
 #!/bin/bash
 export tmp_script_file="/home/anr/tmp_script_temp.sh"
 cp /home/anr/tmp_script $tmp_script_file
 chmod a+x $tmp_script_file
 cat $tmp_script_file
 expect << 'EOF'
 set timeout -1
 spawn  $env(tmp_script_file)
 expect {
 "INVALID "  { exit 4 }
 timeout     { exit 4 }
 eof
 }

 foreach {pid spawnid os_error_flag value} [wait] break

 if {$os_error_flag == 0} {
     puts "exit status: $value"
     exit $value
 } else {
     puts "errno: $value"
     exit $value
 }
 EOF
 echo "spawned process status" $?
 rm -f $tmp_script_file
 echo "done"

Script généré :

 [Linux Dev:anr ]$ cat tmp_script
 exit 3

Exécution du script Expect :

 [Linux Dev:anr ]$ ./testexit.sh
 exit 3
 spawn /home/anr/tmp_script_temp.sh
 exit status: 3
 spawned process status 3
 done

Merci Glenn encore une fois..


Après avoir lutté quelques jours avec l'expansion de la variable à l'intérieur de l'attend heredoc, je suis finalement tombé sur une autre approche que je pensais pouvoir être utile à quelqu'un dans le besoin. Mon exigence était de transmettre la commande et le mot de passe à une fonction shell, d'exécuter la commande dans l'hôte distant dans le cadre de expect heredoc et d'obtenir le code de sortie de retour.

Exemple :

function shell_function {
   # Get the command and password as arguments
   # Run command using expect
   # Return the exit code
}

shell_function <cmd> <password>
echo $?

Comme tout le monde, l'expansion de la variable à l'intérieur de l'heredoc était un problème, ce qui nécessitait d'exporter la valeur dans une variable d'environnement et d'utiliser env pour obtenir la variable à l'intérieur de heredoc. Depuis, le mot de passe était l'un des arguments que je ne voulais pas stocker dans le cadre d'une variable d'environnement. Ainsi, au lieu d'entourer l'ouverture d'heredoc de guillemets simples, les variables d'heredoc ont été échappées. Cela permettait l'utilisation directe des arguments passés.

Voici le script final :

#! /bin/bash
# This function runs a command like 'ssh' and provides the password
function run_with_password {
    cmd="$2"
    paswd="$1"
    expect << END
        set timeout 60
        spawn $cmd
        expect {
            "yes/no" { send "yes\r" }
            "*assword*" { send -- $paswd\r }
        }
        expect EOF
        catch wait result
        exit [lindex \$result 3]
END
}

my_password="AnswerIS42Really?"
cmd_to_run="ssh [email protected]"
cmd_to_run="$cmd_to_run ls .sawfish"
run_with_password $my_password "$cmd_to_run"
echo "Command run code: $?"

Dans le code ci-dessus, la variable attendue échappée est $result . Après avoir changé la variable en \$result , le script a commencé à fonctionner comme un charme.

Mes sincères remerciements aux utilisateurs qui ont fourni des réponses aux questions suivantes, qui ont servi de tremplin pour atteindre ma solution.

Douglas Leeder :aide avec le script expect, exécutez cat sur une composition distante et obtenez-en la sortie dans la variable

glenn jackman :Comment renvoyer le code de sortie du processus généré dans le script Expect ?


Linux
  1. Comment obtenir l'adresse IP externe dans un script shell ?

  2. Comment chiffrer ou rendre le script shell illisible ?

  3. Comment lire le code source des commandes shell ?

  4. Comment obtenir le statut de sortie d'une boucle dans bash

  5. Comment exécuter du code dans le shell Django par un script python externe ?

Comment passer un argument dans Expect via la ligne de commande dans un script shell

Comment obtenir l'ID de processus pour tuer un processus nohup ?

Comment obtenir le PID d'un processus enfant forké dans un script shell

Comment puis-je obtenir mon adresse IP externe dans un script shell ?

Comment obtenir le pid d'un processus et invoquer kill -9 dessus dans le script shell ?

Le processus init peut-il être un script shell sous Linux ?