Die übergabe-variable zu `erwarten` in der bash array
Ich versuche, verwenden Sie eine FOR-Schleife zur Iteration über IP-Adressen (in einem bash-array), loggt sich ein, führt ein Skript aus und beendet dann. Das array heißt ${INSTANCE_IPS[@]}. Der folgende code funktioniert nicht, obwohl, wie expect
scheint nicht in der Lage sein zu akzeptieren, die variable $instance.
for instance in ${INSTANCE_IPS[@]}
do
echo $instance
/usr/bin/expect -c '
spawn ssh root@$instance;
expect "?assword: ";
send "<password>\r";
expect "# ";
send ". /usr/local/bin/bootstrap.sh\r";
expect "# ";
send "exit\r" '
done
Jedoch expect
beschwert sich mit:
can't read "instance": no such variable
while executing
"spawn ssh root@$instance"
Gibt es eine weitere Frage auf stackoverflow sich hier, das nutzt Umwelt-Variablen, um dies zu erreichen, jedoch ist es mir nicht erlaubt, Durchlaufen verschiedene IP-Adressen wie kann ich in einem array.
Jede Hilfe ist willkommen.
Cheers
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist das problem mit dem zitieren. Einzelne Anführungszeichen um den ganzen block nicht Bash Variablen erweitern (
$instance
).Ihnen wechseln zu müssen doppelte Anführungszeichen. Aber dann doppelte Anführungszeichen innerhalb von doppelten Anführungszeichen sind nicht erlaubt (es sei denn, Sie entkommen zu lassen), so sind wir besser dran, wenn Sie einfache Anführungszeichen verwenden mit
expect
strings.Versuchen, statt:
Aus der ssh Manpage:
If command is specified, it is executed on the remote host instead of a login shell.
Angabe eines Befehls bedeutet, erwarten Sie nicht warten müssen, für
#
um Ihr Programm auszuführen, dann warten, für einen anderen#
nur um den Befehl zu sendenexit
. Stattdessen, wenn Sie angeben, dass ein Befehl zu ssh, führt er diesen Befehl; es beendet, wenn das getan wird; und dann wird ssh automatisch die Verbindung geschlossen.Abwechselnd, legen Sie den Wert in der Umgebung und erwarten Sie es finden können es
Alten thread, und eine von vielen, aber ich arbeite schon an
expect
für mehrere Tage. Für alle, die auf diesen, ich glaub ich habe gefunden, eine machbare Lösung für das problem der Weitergabebash
Variablen, die innerhalb einerexpect -c
Skript:Bitte beachten Sie, dass die Flucht Zitate sind in der Regel eine zitierte Frage (wie @Roberto Reale oben angegeben), die hab ich gelöst mit einem
heredoc
EOF
Methode vor vorbei an der bash-variable ausgewertet stringexpect -c
. Im Gegensatz zu der Flucht Zitate, alle nativenexpect
Variablen müssen maskiert werden mit\$
(ich bin nicht hier, um zu lösen alle erste-Welt-Probleme-mein Nachmittag Zeitplan ist etwas vollgestopft), aber dies erheblich vereinfachen sollte das problem mit wenig Aufwand. Lassen Sie mich wissen, wenn Sie irgendwelche Probleme mit dieser proof-of-concept.tl;tr: die Erstellung einer [
expect
] daemon-Skript mit user-Authentifizierung und dachte, dieses heraus nach ich verbrachte einen ganzen Tag zu erstellen getrennt bash/expect-Skripte, Verschlüsselung meiner Aufforderung Passwort (via bash) mit einem anderen/dev/random
Salz jeder iteration, speichern Sie das verschlüsselte Kennwort ein temp-Datei und übergeben Sie das Salz, um das erwarten-Skript (sehr entmutigend jedermann leicht zu entdecken Sie das Passwort überps
, aber nicht präventiv, da die erwarten, Skript ersetzt werden könnte). Nun, ich sollte in der Lage sein, um effektiv zu halten es im Speicher statt.