Für diejenigen, die antworten möchten, dass ich SSH-Schlüssel verwenden soll, enthalten Sie sich bitte
Ich versuche, Expect in einem Bash-Skript zu verwenden, um das SSH-Passwort bereitzustellen. Wenn Sie das Passwort angeben, funktioniert es, aber ich lande nicht wie gewünscht in der SSH-Sitzung. Es geht zurück zur Bash.
Mein Skript:
#!/bin/bash
read -s PWD
/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com'
expect "password"
send "$PWD\n"
EOD
echo "you're out"
Die Ausgabe meines Skripts:
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
usr@$myhost.example.com's password: you're out
Ich möchte meine SSH-Sitzung nur dann haben, wenn ich sie beende, um zu meinem Bash-Skript zurückzukehren. Der Grund, warum ich bash vor der Erwartung verwende, ist, dass ich ein Menü verwendet habe, mit dem ich auswählen kann, mit welchem Gerät ich eine Verbindung herstellen möchte.
Vielen Dank
Antworten:
Das Mischen von Bash und Expect ist kein guter Weg, um den gewünschten Effekt zu erzielen. Ich würde versuchen, nur Expect zu verwenden:
Beispiellösung für Bash könnte sein:
Dies wartet auf die Eingabe und kehrt dann (für einen Moment) zur interaktiven Sitzung zurück.
quelle
Am einfachsten ist es, sshpass zu verwenden . Dies ist in Ubuntu / Debian-Repos verfügbar und Sie müssen sich nicht mit der Integration von Expect in Bash befassen.
Ein Beispiel:
Der obige Befehl kann einfach in ein Bash-Skript integriert werden.
Hinweis: Bitte lesen Sie den Abschnitt
man sshpass
Sicherheitsüberlegungen in, um die Auswirkungen auf die Sicherheit vollständig zu verstehen.quelle
sshpass
tut es hoffentlich , aber selbst dann gibt es eine Zeitspanne, in der es noch startet, bevor es dies tun kann, wenn das Passwort für jeden Prozess verfügbar ist.sshpass
wird in einem Szenario verwendet, in dem Sie einfache Testskripte haben, die in einer lokalen Netzwerkumgebung ausgeführt werden, in der Sicherheit nicht das Hauptanliegen ist. Tatsächlich gibt es einen Abschnitt, inman sshpass
dem ein ganzer Abschnitt zu Sicherheitsaspekten erläutert wird. Fügte dies hinzu, um zu antworten: Danke.Fügen Sie den Befehl "Interact" Expect kurz vor Ihrem EOD hinzu:
Auf diese Weise können Sie mit dem Remotecomputer interagieren, bis Sie sich abmelden. Dann bist du wieder in Bash.
quelle
expect eof
löste das Problem.'
vonusr@$myhost.example.com'
und es sollte funktionieren. Und vielleicht müssen Sie ersetzen\n
mit\r
, aber YMMVNachdem ich monatelang nach einer Antwort auf die Frage gesucht habe, finde ich endlich eine wirklich beste Lösung: ein einfaches Skript zu schreiben.
Setzen Sie es auf
/usr/bin/exp
, dann können Sie verwenden:exp <password> ssh <anything>
exp <password> scp <anysrc> <anydst>
Getan!
quelle
expect "assword:"
hast du gemeintexpect "password:"
?"assword"
wird sowohl mitPassword
als auch übereinstimmenpassword
.Stellen Sie auch sicher, zu verwenden
Stattdessen schlagen Kennwörter, die mit einem Bindestrich (-) beginnen, ansonsten fehl.
Das Obige interpretiert eine Zeichenfolge, die mit einem Bindestrich beginnt, nicht als Option für den Sendebefehl.
quelle
Ein einfaches Erwartungsskript
Remotelogin.exp
Beispiel:
quelle
Verwenden Sie das
fd0ssh
Hilfsprogramm (von hxtools, nicht von pmt). Es funktioniert, ohne dass Sie eine bestimmte Eingabeaufforderung vom ssh-Programm erwarten müssen.quelle
echo "yoursshpass" | fd0ssh ssh -c -L$port:$ip:$remote_port [email protected] &
DANKE!sshpass
.Eine andere Möglichkeit, die ich nützlich fand, um ein kleines Expect-Skript aus einem Bash-Skript zu verwenden, ist die folgende.
Das funktioniert weil
...If the string "-" is supplied as a filename, standard input is read instead...
quelle
-
hier nicht, da es standardmäßigexpect
liest,stdin
wenn Sie es ohne Argument aufrufen. Es ist jedoch nützlich, wenn Sie es interaktiv ohne Eingabeaufforderung (expect
vs.expect -
) ausführen möchten oder wenn Sie etwas tun,expect -f "$@"
bei dem das erste Argument eine Datei sein soll, auch wenn es wie eine Option aussieht (beginnt mit-
). In diesem Fall liest if$1
(die angegebene Datei)-
ausstdin
.sshpass
ist fehlerhaft, wenn Sie versuchen, es innerhalb des Erstellungsziels von Sublime Text in einem Makefile zu verwenden. Stattdessensshpass
können Sie verwendenpassh
: https://github.com/clarkwang/passhMit
sshpass
dir würde tun:Mit
passh
dir würde tun:Hinweis: Vergessen Sie nicht
-o StrictHostKeyChecking=no
, die Verbindung zu verwenden , da sie sonst bei der ersten Verwendung hängen bleibt. Beispielsweise:Verweise:
quelle