2016-12-30 9 views
1

Я пытаюсь включить пароль ssh для входа в систему из кластера хостов. Таким образом, после того, как я генерировать id_rsa.pub по ssh-keygen, Я хочу скопировать его на всех остальных с помощью этой командыИспользование Expect для копирования файла с одного пульта дистанционного управления на другой

Эта команда работает в оболочке, но я просто не мог сделать его spawn, как ожидается. То, что я сейчас пытаюсь это:

#!/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" } 
} 

Я отлажена его и обнаружил, что последний sending работал, но результат просто неожиданным, как и в скорлупе. Я также попытался объединить send -- "ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]$server\r" и spawn ssh -t [email protected]$client, а затем обработать их как по иерархическому пути с ожиданием, так и по результату. Сценарий просто не мог двигаться дальше, чтобы завершить последнюю отправку password, или мы можем сказать, что он не мог отправить на правильный канал. Я действительно запутался прямо сейчас.

Может ли кто-нибудь помочь?

Настоятельно ценю помощь от вас! Спасибо огромное!

Если у вас есть хорошая рекомендация или учебные пособия, я также буду очень благодарен за ваш обмен!

ответ

1

Вы должны ждать ssh-copy-id команды до конца, так же, как при ручном запуске команды.

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

Спасибо @whjm это просто работает гладко! Похоже, что последний 'ожидать '$' 'действительно много значит здесь. – Hearen

0

Использование ssh-copy-id и sshpass команд.
Вот мое oneline решение:

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

 Смежные вопросы

  • Нет связанных вопросов^_^