Есть ли в Ruby эквивалентный драгоценный камень для Ruby? - PullRequest
19 голосов
/ 22 августа 2011

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

Я попытался выполнить поиск на code.google и rubygems.org, но, к сожалению, он не появился. - это инструмент автоматизации и тестирования Unix, написанный Доном Либесом как расширение языка сценариев Tcl, для интерактивных приложений, таких как telnet, ftp, passwd, fsck, rlogin, tip, ssh и других.

Ответы [ 6 ]

24 голосов
/ 05 сентября 2011

Ruby поставляется с модулем PTY для настройки псевдотерминалов для запуска приложений интерактивной командной строки. С ним приходит expect метод , который позволяет вам взаимодействовать с приложением, вроде Expect. Чтобы узнать, как использовать функцию ожидаемого, я обнаружил, что " Чего ожидать от библиотеки ожиданий Ruby? " полезно.

Что касается драгоценных камней, возможно, обратите внимание greenletters , что должно улучшить ожидаемый PTY + (хотя я сам не пробовал).

7 голосов
/ 21 августа 2013

Недавно я потратил немало времени на борьбу с этой проблемой (я застрял с 1.8.7).Я нашел этот вопрос , этот пост в блоге и эту ветку форума действительно полезным.

В конце это код моего приложения, если кто-тоинтересует небольшой пример (при подписывании пакетов передайте пароль в 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 голосов
/ 23 августа 2013

Оформить заказ на этот рубин: https://github.com/abates/ruby_expect. Он может решить небольшую задачу для вас.из его официального примера достаточно «ввести пароль» и войти в систему и взаимодействовать с локальным скриптом.

вот пример, который обновляет код 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 

shensiwei@gforge.1ver??.net's 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.

. Для получения дополнительных примеров и подробностей, пожалуйста, погрузитесь в его исходный код.

1 голос
/ 22 августа 2011

well4r , кажется, выполняет то, что вы запрашиваете, хотя оно специально для соединений с устройствами Cisco и Juniper.

Возможно, еще лучше yax , поскольку это "еще одно ожидание".

0 голосов
/ 15 ноября 2014

parley - еще один вариант, который вы можете попробовать (написано мной). Это вдохновлено Perl ожидают.

0 голосов
/ 07 января 2014

RExpect

С веб-сайта проекта:

RExpect - это замена для замены модуля ожидаемого в стандартной библиотеке, которая работает быстрее иболее надежный, способный управлять многими устройствами одновременно.

...