Подтвердить что ты не робот

Есть ли эквивалент Gem для Ruby?

Есть ли эквивалентный драгоценный камень Expect для Ruby?

Я попытался выполнить поиск по code.google и rubygems.org, но, к сожалению, он не появился.

FYI: Expect - это инструмент для автоматизации и тестирования Unix, написанный доном Libes как расширение языка сценариев Tcl для интерактивных приложений, таких как telnet, ftp, passwd, fsck, rlogin, tip, ssh и другие.

4b9b3361

Ответ 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.