Ruby有Expect等效的宝石吗?
我尝试搜索code.google和rubygems.org,但遗憾的是它没有出现。
仅供参考:Expect是一个Unix自动化和测试工具,由Don Libes编写,作为Tcl脚本语言的扩展,用于交互式应用程序,如telnet,ftp,passwd,fsck,rlogin,tip,ssh,和其他人。
答案 0 :(得分:24)
Ruby附带了PTY模块,用于设置伪终端以驱动交互式命令行应用程序。随之而来的是expect
method,它允许您与Expect等应用程序进行交互。为了学习如何使用expect,我发现“What to expect from the Ruby expect library?”很有帮助。
就宝石而言,也许结账greenletters应该会对PTY +期望有所改善(虽然我自己没有尝试过)。
答案 1 :(得分:7)
我最近花了很多时间来解决这个问题(我坚持1.8.7)。我发现了这个question,这个blog post和forum thread非常有用。
最后这是我的应用程序代码,如果有人对一个小例子感兴趣(在签名包时将密码传递给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添加有关此内容的评论。
答案 2 :(得分:3)
结帐这个rubygem: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.
有关更多示例和详细信息,请深入了解其源代码。
答案 3 :(得分:1)
答案 4 :(得分:0)
答案 5 :(得分:0)
parley是你可以尝试的另一个,(由我写)。它的灵感来自Perl期待。