ожидать, что скрипт зависнет при вызове из Ruby - PullRequest
0 голосов
/ 20 декабря 2010

У меня есть список хостов, на которые мне нужно установить мой открытый ключ.Для этого я написал сценарий 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}

Вы увидите два ожидаемых утверждения выше.Первый оператор обрабатывает случай, когда пароль запрашивается немедленно (т. Е. Ключ хоста известен) путем немедленного взаимодействия .Он также обрабатывает случай, когда неизвестный хост идентифицируется, отвечая «да».

Второе ожидание выполняется, когда первое ожидание ответило «да», приводя к запрашиваемому паролю.

Ответы [ 2 ]

1 голос
/ 23 декабря 2010

Я полагаю, проблема в том, что вы вызываете сценарий ожидания с `backticks`, однако сценарий ожидания взаимодействует.Кажется, что обратные ссылки в рубине не позволяют полноценного взаимодействия (возможно, блокирование стандартного ввода).Возможно, вы захотите исследовать модуль ожидаемых в ruby ​​и покончить с отдельным скриптом ожидаемого.

0 голосов
/ 28 декабря 2010

Спасибо, ребята. Но я обнаружил, что ответ на проблему очень прост:

  puts `#{command}`

Я предполагал, что `` в ruby ​​объединит дескрипторы stdout и stderr команды shell со скриптом ruby. Это неправильно.

...