2016-12-30 4 views
1

Ich versuche, Passwort-freie SSH-Anmeldung in einem Cluster von Hosts zu ermöglichen. So, nachdem ich die id_rsa.pub von ssh-keygen erzeugen, möchte ich kopieren Sie es auf alle anderen von diesem BefehlVerwenden von Erwarten, um eine Datei von einem Remote zu einem anderen zu kopieren

Dieser Befehl funktioniert in der Schale, aber ich konnte einfach nicht machen es durch spawn als erwartet. Was bin ich versuche derzeit, ist dies:

#!/usr/bin/expect 

#exp_internal 1 
set user_name [lindex $argv 0] 
set password [lindex $argv 1] 
set client [lindex $argv 2] 
set server [lindex $argv 3] 

set timeout -1 
spawn ssh -t [email protected]$client 
expect { 
    # first connection, no public key in ~/.ssh/known_hosts 
    "yes/no" { 
     send -- "yes\r" 
     exp_continue 
    } 
    # already has public key in ~/.ssh/known_hosts 
    "password:" { 
     send -- "$password\r" 
    } 
} 
expect "$ " 
send -- "ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]$server\r" 
expect { 
    "yes/no" { 
     send -- "yes\r" 
     exp_continue 
    } 
    "password:" { send -- "$password\r" } 
} 

ich es ausgetestet und fand heraus, dass die letzten sending gearbeitet, aber das Ergebnis ist nur unerwartet, da die in der Schale. Ich habe auch versucht, die send -- "ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]$server\r" und spawn ssh -t [email protected]$client zusammenzuführen und dann beide in einer hierarchischen expect-send-Weise zu behandeln, aber das Ergebnis ist das gleiche. Das Skript konnte einfach nicht weitergehen, um die letzte password Sendung zu vervollständigen, oder wir können es sagen, dass es nicht an den richtigen Kanal senden konnte. Ich bin gerade sehr verwirrt.

Konnte jemand ein wenig helfen?

Wirklich zu schätzen die Hilfe von Ihnen! Ich danke dir sehr!

Wenn es ein paar gute Referenz oder Tutorials auf Expect gibt, werde ich es auch für Ihr Teilen zu schätzen wissen!

Antwort

1

Sie müssen für den ssh-copy-id Befehl bis zum Ende warten, wie wenn Sie manuell den Befehl ausführen.

expect -ex "$ " 
send -- "ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]$server\r" 
expect { 
    "yes/no" { 
     send -- "yes\r" 
     exp_continue 
    } 
    "password:" { send -- "$password\r" } 
} 
expect -ex "$ " 
+0

Danke @whjm es funktioniert einfach reibungslos! Es scheint, dass das letzte "erwarten" $ "hier wirklich viel bedeutet. – Hearen

0

Verwenden Sie die Befehle ssh-copy-id und sshpass.
Hier ist meine oneline Lösung:

for i in `cat hosts.txt`; do sshpass -p YOUR_PASSWORD_HERE ssh-copy-id -i ~/.ssh/id_rsa.pub -o StrictHostKeyChecking=no $i; done

Verwandte Themen