У меня есть список хостов, на которые мне нужно установить мой открытый ключ.Для этого я написал сценарий ruby, который вызывает ожидающий сценарий и передает ему мой пароль, имя хоста и файл открытого ключа.Этот ожидающий сценарий, в свою очередь, выполняет ssh-copy-id для каждого хоста, вводя пароль и отвечая «да» на неизвестные ключи хоста.
Ожидаемый сценарий работает абсолютно нормально при запуске для командной строки.Но при выполнении из сценария ruby ожидаемый не отвечает «да» для неизвестного подтверждения ключа хоста: «Вы уверены, что хотите продолжить подключение (да / нет)?».Скрипт ожидаемого просто зависает, когда ему задается вопрос да / нет.
Любая помощь будет принята с благодарностью.
Вот мой скрипт ruby:
#!/usr/bin/env ruby -w
hosts=['test@blah1.edu','test2@blah2.edu','test3@blah3.edu']
password="blahblahblah"
key_file="/home/blah/.ssh/id_rsa.pub"
hosts.each{ |host|
command="expect sshcopy.exp #{host} #{key_file} #{password}"
`#{command}`
}
А вот мой ожидаемый сценарий sshcopy.exp :
set host [lrange $argv 0 0]
set key_file [lrange $argv 1 1]
set password [lrange $argv 2 2]
spawn ssh-copy-id -i $key_file $host
expect -nocase "*password: $" {send "$password\r"; interact} -nocase "*are you sure you want to continue connecting (yes/no)? $" {send "yes\r"} eof{exit}
expect -nocase "*password: $" {send "$password\r"; interact} eof{exit}
Вы увидите два ожидаемых утверждения выше.Первый оператор обрабатывает случай, когда пароль запрашивается немедленно (т. Е. Ключ хоста известен) путем немедленного взаимодействия .Он также обрабатывает случай, когда неизвестный хост идентифицируется, отвечая «да».
Второе ожидание выполняется, когда первое ожидание ответило «да», приводя к запрашиваемому паролю.