Из bash-скрипта:
source ./expect.sh
Я включаю ожидаемый код:
#!/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
И я получаю это:
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:
Затем я пытаюсь подключиться, и мне предлагается ввести пароль...
Проверив сервер, я уверен, что никакой ключ не был загружен, поскольку я ожидал увидеть файл «authorized_keys»:
root@server: ls /home/user/.ssh/
known_hosts
Что я делаю не так?
решение1
Проблема в том, что ssh-клиент считывает пароль непосредственно с терминала, а не со стандартного ввода.
Самый простой способ обойти это, который я знаю, — установить «sshpass», а затем использовать это (без Expect):
sshpass -p "thepassword" ssh-copy-id -i /home/user/.ssh/id_rsa.pub [email protected]
решение2
Следующий скрипт тоже должен подойти.
#!/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"; }
}
Вам нужно сделать его исполняемым и вызвать его следующим образом:
./ssh-copy-id.exp <user> <host> <password>
В твоем случае:
./ssh-copy-id.exp root 111.111.111.111 thepassword
решение3
Вы копируете ключ, /root/.ssh/authorized_keys
а не учетную запись пользователя. Обратите внимание, где написано:[email protected]'s password:
решение4
!/usr/bin/env баш
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 }
}
}
}
}
}"
}
отпечатки пальцев