Mit dem wait
erhalten Sie den Exit-Status des gespawnten Prozesses Befehl:
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
Von der Expect-Manpage
warte [args]
Verzögerungen, bis ein erzeugter Prozess (oder der aktuelle Prozess, falls keiner benannt ist) beendet wird.
warten gibt normalerweise eine Liste von vier ganzen Zahlen zurück. Die erste Ganzzahl ist die PID des Prozesses, auf den gewartet wurde. Die zweite Ganzzahl ist die entsprechende Spawn-ID. Die dritte Ganzzahl ist -1, wenn ein Betriebssystemfehler aufgetreten ist, andernfalls 0. Wenn die dritte Ganzzahl 0 war, ist die vierte Ganzzahl der Status, der vom erzeugten Prozess zurückgegeben wird. Wenn die dritte Ganzzahl -1 war, ist die vierte Ganzzahl der Wert von errno, der vom Betriebssystem festgelegt wurde. Die globale Variable errorCode wird ebenfalls gesetzt.
Ändern
expect {
"INVALID " { exit 4 }
timeout { exit 4 }
}
zu
expect {
"INVALID " { exit 4 }
timeout { exit 4 }
eof
}
Fügen Sie dann die lassign
hinzu und if
Befehle.
Mit Hilfe von Glenn habe ich eine Lösung bekommen.. und mein letztes Skript ist::
erwartetes Skript ist
[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"
Gespawntes Skript:
[Linux Dev:anr ]$ cat tmp_script
exit 3
Ausführung des Expect-Skripts:
[Linux Dev:anr ]$ ./testexit.sh
exit 3
spawn /home/anr/tmp_script_temp.sh
exit status: 3
spawned process status 3
done
Danke Glenn noch einmal..
Nachdem ich einige Tage mit dem Erweitern der Variablen im erwarteten Heredoc gekämpft hatte, stieß ich schließlich auf einen anderen Ansatz, von dem ich dachte, dass er für jemanden in Not hilfreich sein könnte. Meine Anforderung war, Befehl und Passwort an eine Shell-Funktion zu übergeben, den Befehl im Remote-Host als Teil von Expect Heredoc auszuführen und den Rückkehr-Exit-Code zu erhalten.
Beispiel:
function shell_function {
# Get the command and password as arguments
# Run command using expect
# Return the exit code
}
shell_function <cmd> <password>
echo $?
Wie bei allen anderen war das Erweitern von Variablen im Heredoc ein Problem, das den Export des Werts in eine Umgebungsvariable und die Verwendung von env
erforderte um die Variable im Heredoc zu erhalten. Da das Passwort eines der Argumente war, wollte ich es nicht als Teil einer Umgebungsvariablen speichern. Anstatt also die Heredoc-Öffnung in einfache Anführungszeichen einzuschließen, wurden die Variablen von Heredoc maskiert. Dies ermöglichte die direkte Verwendung von übergebenen Argumenten.
Es folgt das endgültige Skript:
#! /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: $?"
Im obigen Code ist die Escape-Variable $result
. Nachdem Sie die Variable auf \$result
geändert haben , das Skript funktionierte wie am Schnürchen.
Mein aufrichtiger Dank gilt den Benutzern, die Antworten auf die folgenden Fragen gegeben haben, die als Sprungbrett für meine Lösung dienten.
Douglas Leeder:Hilfe beim Erwartungsskript, starte cat auf einem entfernten Comp und bekomme die Ausgabe davon in die Variable
glenn jackman:Wie kann ich den erzeugten Prozess-Exit-Code im Expect-Skript zurückgeben?