Analysieren Sie die Ausgabe einer Expect-Variable und verwenden Sie sie in einem Bash-Skript.

Analysieren Sie die Ausgabe einer Expect-Variable und verwenden Sie sie in einem Bash-Skript.

Ich habe ein Bash-Skript, das „expect“ innerhalb des Bash-Skripts verwendet. Dieses Bash-Skript fordert im „expect“-Teil des Skripts zur Eingabe eines Kennworts auf und gibt dann eine Ausgabe zurück. Ich möchte diese Ausgabe nehmen und analysieren, sodass mir nur ein Teil der Ausgabe angezeigt wird und dieser in einer Variablen gespeichert wird, die das normale Bash-Skript verwenden kann. Mein Skript lautet:

#!/bin/sh

output=$(
/usr/bin/expect << EOF
spawn -noecho generate passcode -a 123456789
expect "passphrase:" { send "password\n" }
expect eof
EOF
#)
) | awk '/^ [a-zA-Z]*: (\S+)/'

echo $output

Die Ausgabe, die ich ohne den awk-Regex erhalte, ist: Passcode: 543245324532455464 Mein Regex analysiert die Ausgabe und speichert nur den 543245324532455464Wert in der Ausgabevariable. Das hatte ich gehofft. Wenn ich das | awk '/^ [a-zA-Z]*: (\S+)/'an das Ende des Befehls anhänge, wird nichts zurückgegeben, nur ein Leerzeichen. Wenn ich es entferne, wird die erwartete Ausgabe zurückgegeben.

Kann mir jemand sagen, wie ich die richtigen Daten in meiner Variable in Bash speichern kann?

Antwort1

Wie geschrieben, erfassen Sie die Ausgabe von /usr/bin/expect und leiten dann nichts an awk weiter - die schließende Klammer der Befehlsersetzung muss am Ende der Pipeline stehen

nicht

... ) | awk '/^ [a-zA-Z]*: (\S+)/'

Aber

... | awk '/^ [a-zA-Z]*: (\S+)/')

Beachten Sie, dass dies \Skein Standard ist (PCRE) und möglicherweise nicht in allen Versionen von awk unterstützt wird und dass die Erfassungsgruppe wahrscheinlich keine Auswirkung hat - Sie kommen möglicherweise besser mit etwas wie

awk -F': ' '$1 ~ /Passcode/ {print $2}'

verwandte Informationen