Aus einem Bash-Skript:
source ./expect.sh
Ich füge einen Expect-Code ein:
#!/bin/bash
/usr/bin/expect <<EOL
spawn ssh-copy-id -i /home/user/.ssh/id_rsa.pub 111.111.111
expect '*?assword*'
send 'thepassword'
interact
EOL
Und ich bekomme Folgendes:
spawn ssh-copy-id -i /home/user/.ssh/id_rsa.pub 111.111.111.111
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:
Dann versuche ich, eine Verbindung herzustellen, und werde zur Eingabe eines Kennworts aufgefordert ...
Beim Überprüfen des Servers bin ich sicher, dass kein Schlüssel hochgeladen wurde, da ich eine Auflistung der Datei „authorized_keys“ erwarten würde:
root@server: ls /home/user/.ssh/
known_hosts
Was mache ich falsch?
Antwort1
Das Problem besteht darin, dass der SSH-Client das Kennwort direkt vom Terminal und nicht von der Standardeingabe liest.
Der einfachste Weg, den ich kenne, ist, „sshpass“ zu installieren und dann Folgendes zu verwenden (ohne Expect):
sshpass -p "thepassword" ssh-copy-id -i /home/user/.ssh/id_rsa.pub [email protected]
Antwort2
Das folgende Skript sollte auch funktionieren
#!/usr/bin/expect -f
#
# Install RSA SSH KEY with no passphrase
#
set user [lindex $argv 0]
set host [lindex $argv 1]
set password [lindex $argv 2]
spawn ssh-copy-id -i /path/to/your/.ssh/id_rsa.pub $user@$host
expect {
"continue" { send "yes\n"; exp_continue }
"assword:" { send "$password\n"; }
}
Sie müssen es ausführbar machen und wie folgt aufrufen:
./ssh-copy-id.exp <user> <host> <password>
In Ihrem Fall:
./ssh-copy-id.exp root 111.111.111.111 thepassword
Antwort3
Sie kopieren den Schlüssel in /root/.ssh/authorized_keys
das Benutzerkonto und nicht in das Benutzerkonto. Beachten Sie, wo es heißt:[email protected]'s password:
Antwort4
!/usr/bin/env bash
fingerprints(){
/usr/bin/expect -c "set timeout 50; spawn ssh-copy-id -i /root/.ssh/id_rsa.pub -p\ <port num>\ root@$<your server>;
expect {
\"assword: \" {
send \<your pwd>\n\"
expect {
\"again.\" { exit 1 }
\"expecting.\" { }
timeout { exit 1 }
}
}
\"(yes/no)? \" {
send \"yes\n\"
expect {
\"assword: \" {
send \"<your pwd>\n\"
expect {
\"again.\" { exit 1 }
\"expecting.\" { }
timeout { exit 1 }
}
}
}
}
}"
}
Fingerabdrücke