it-swarm.com.de

Verwenden Sie expect im Bash-Skript, um das Kennwort für den SSH-Befehl bereitzustellen

Für diejenigen, die antworten möchten, dass ich SSH-Schlüssel verwenden soll, bitte enthalten

Ich versuche, "expect" in einem Bash-Skript zu verwenden, um das SSH-Passwort bereitzustellen. Wenn das Passwort funktioniert, ich aber nicht in der SSH-Sitzung lande, wie ich sollte, geht es direkt zurück zur Bash-Sitzung.

Mein Drehbuch:

#!/bin/bash

read -s PWD

/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no [email protected]$myhost.example.com'
expect "password"
send "$PWD\n" 
EOD
echo "you're out"

Die Ausgabe meines Skripts:

spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no [email protected]$myhost.example.com
[email protected]$myhost.example.com's password: you're out

Ich möchte meine SSH-Sitzung nur dann abhalten, wenn ich sie beende, um zu meinem Bash-Skript zurückzukehren. Der Grund, warum ich bash vorerwartet verwende, ist, dass ich ein Menü verwendet habe, mit dem ich auswählen kann, mit welchem ​​Gerät ich mich verbinden möchte.

Vielen Dank

121
Max

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:

#!/usr/bin/expect
eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no [email protected]$myhost.example.com
#use correct Prompt
set Prompt ":|#|\\\$"
interact -o -nobuffer -re $Prompt return
send "my_password\r"
interact -o -nobuffer -re $Prompt return
send "my_command1\r"
interact -o -nobuffer -re $Prompt return
send "my_command2\r"
interact

Die Musterlösung für bash könnte sein:

#!/bin/bash
/usr/bin/expect -c 'expect "\n" { eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no [email protected]$myhost.example.com; interact }'

Dies wartet auf die Eingabe und kehrt dann (für einen Moment) zur interaktiven Sitzung zurück.

76
Piotr Król

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 mit Bash befassen.

Ein Beispiel:

sshpass -p<password> ssh <arguments>
sshpass -ptest1324 ssh [email protected] ls -l /tmp

Der obige Befehl kann einfach in ein Bash-Skript integriert werden.

Hinweis: Bitte lesen Sie den Abschnitt Sicherheitsaspekte in man sshpass für ein umfassendes Verständnis der Sicherheitsaspekte.

51
dotnix

Fügen Sie den Befehl 'interact' expect unmittelbar vor Ihrem EOD hinzu:

#!/bin/bash

read -s PWD

/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no [email protected]$myhost.example.com
expect "password"
send "$PWD\n" 
interact
EOD
echo "you're out"

Auf diese Weise sollten Sie mit dem Remotecomputer interagieren können, bis Sie sich abmelden. Dann bist du zurück in der Bash.

18
dr-jan

Nachdem ich monatelang nach einer Antwort auf die Frage gesucht habe, finde ich endlich eine wirklich beste Lösung: das Schreiben eines einfachen Skripts.

#!/usr/bin/expect

set timeout 20

set cmd [lrange $argv 1 end]
set password [lindex $argv 0]

eval spawn $cmd
expect "assword:"
send "$password\r";
interact

Setzen Sie es auf /usr/bin/exp, dann können Sie verwenden:

  • exp <password> ssh <anything>
  • exp <password> scp <anysrc> <anydst>

Getan!

13
damn_c

Ein einfaches Expect-Skript

Remotelogin.exp

    #!/usr/bin/expect
    set user [lindex $argv 1]
    set ip [lindex $argv 0]
    set password [lindex $argv 2]
    spawn ssh [email protected]$ip
    expect "password"
    send "$password\r"
    interact

Beispiel:

    ./Remotelogin.exp <ip> <user name> <password>
7
Vijay S B

Stellen Sie auch sicher, zu verwenden

send -- "$PWD\r" 

stattdessen schlagen Kennwörter, die mit einem Bindestrich (-) beginnen, ansonsten fehl.

Der obige Befehl interpretiert keine Zeichenfolge, die mit einem Bindestrich beginnt, als Option für den Sendebefehl.

7
Timmah

Verwenden Sie das Hilfswerkzeug fd0ssh (von hxtools, nicht pmt), es funktioniert, ohne dass eine bestimmte Eingabeaufforderung vom ssh-Programm erwartet werden muss.

6
user562374

Eine andere Möglichkeit, ein kleines Expect-Skript aus einem Bash-Skript zu verwenden, ist die folgende.

...
bash-script start
bash-commands
...
expect - <<EOF 
spawn your-command-here
expect "some-pattern"
send "some-command"
...
...
EOF
...
more bash commands
...

Das funktioniert, weil ...If the string "-" is supplied as a filename, standard input is read instead...

4
Jimbo

sshpass ist fehlerhaft, wenn Sie versuchen, es innerhalb eines Sublime Text-Build-Ziels in einem Makefile zu verwenden. Anstelle von sshpass können Sie passh: https://github.com/clarkwang/passh verwenden

Mit sshpass würden Sie Folgendes tun:

sshpass -p ssh [email protected]

Mit passh würden Sie Folgendes tun:

passh -p ssh [email protected]

Hinweis: Vergessen Sie nicht, -o StrictHostKeyChecking=no Zu verwenden, da sonst die Verbindung bei der ersten Verwendung unterbrochen wird. Zum Beispiel:

passh -p ssh -o StrictHostKeyChecking=no [email protected]

Verweise:

  1. Der Befehl zum Senden des Kennworts funktioniert nicht mit dem Expect-Skript in der SSH-Verbindung
  2. https://askubuntu.com/questions/87449/how-to-disable-strict-Host-key-checking-in-ssh
  3. https://linuxcommando.blogspot.com/2008/10/how-to-disable-ssh-Host-key-checking.html
  4. https://serverfault.com/questions/330503/scp-without-known-hosts-check
  5. https://debian-administration.org/article/587/pam_mount_and_sshfs_with_password_authentication
0
user