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 ?