Есть ли эквивалент Gem для Ruby?
Есть ли эквивалентный драгоценный камень Expect для Ruby?
Я попытался выполнить поиск по code.google и rubygems.org, но, к сожалению, он не появился.
FYI: Expect - это инструмент для автоматизации и тестирования Unix, написанный доном Libes как расширение языка сценариев Tcl для интерактивных приложений, таких как telnet, ftp, passwd, fsck, rlogin, tip, ssh и другие.
Ответы
Ответ 1
Ruby поставляется с модулем PTY для настройки псевдотерминалов для управления интерактивными приложениями командной строки. В нем используется метод expect
, который позволяет вам взаимодействовать с приложением вроде Expect. Чтобы узнать, как использовать ожидание, я нашел " Что ожидать от библиотеки Ruby ожидать?" полезно.
Что касается драгоценных камней, возможно, проверка greenletters, которая должна улучшиться при ожидании PTY + (хотя я еще не пробовал сам).
Ответ 2
Недавно я потратил немало времени на борьбу с этой проблемой (я застрял с 1.8.7). Я нашел этот question, этот пост в блоге и этот тема форума действительно полезен.
В конце это мой код приложения, если кто-то заинтересован в небольшом примере (передайте пароль на rpm при подписании пакетов):
def run_interactive command, password, promt
output = ''
begin
r, w, pid = PTY.spawn(command)
puts r.expect(promt)
sleep(0.5)
w.puts(password)
begin
r.each { |l| output += l }
rescue Errno::EIO
end
$?.exitstatus
Process.wait(pid)
rescue PTY::ChildExited => e
$stderr.puts "The child process #{e} exited! #{$!.status.exitstatus}"
end
output
end
password = "mypassword"
command = "rpm --define '_signature gpg' --define '_gpg_name #{key_id}' --addsign #{package}"
promt = %r{.*: }
expected = %r{good}
output = run_interactive(command, password, promt)
if output.match(expected)
puts output
else
abort "Error: expected: '#{expected}' got '#{output}'"
end
У него мало ошибок, но это все, что мне нужно.
Изменить: обновите код с помощью Process.wait(pid)
, чтобы убедиться, что он заканчивается перед продолжением и добавьте комментарий об этом для 1.8.7.
Ответ 3
проверить этот rubygem: https://github.com/abates/ruby_expect. Он может справиться с небольшой задачей для вас. из своего официального примера достаточно "ввести пароль" и войти в систему и взаимодействовать с локальным script.
Вот пример, который обновляет код git (который аутентифицирован с паролем):
require 'rubygems'
require 'ruby_expect'
def update_code
password = 'your password here'
exp = RubyExpect::Expect.spawn('git pull', :debug => true)
exp.procedure do
each do
expect /password: / do
send password
end
end
end
end
update_code
просто запустите код выше, и ваш будет выглядеть следующим образом:
$ ruby update_code.rb
[email protected]??.net password:
remote: Counting objects: 133, done.
remote: Compressing objects: 100% (84/84), done.
remote: Total 85 (delta 62), reused 0 (delta 0)
Unpacking objects: 100% (85/85), done.
для более подробного примера и деталей, пожалуйста, погрузитесь в его исходный код.
Ответ 4
expect4r, похоже, делает то, о чем вы просите, хотя он специально предназначен для подключения к устройствам Cisco и Juniper.
Возможно, даже лучше yax, так как это "еще одно ожидание".
Ответ 5
RExpect
На веб-сайте проекта:
RExpect - это замена для модуля expect.rb в стандартная библиотека, которая быстрее и надежнее, удобна в управлении многие устройства одновременно.
Ответ 6
parley - это еще один пример, который вы можете попробовать (написано мной). Он вдохновлен ожиданием Perl.