rails - que significa en ruby
¿Hay una gema equivalente esperada para Ruby? (6)
¿Hay una gema equivalente esperada para Ruby?
Intenté buscar en code.google y rubygems.org, pero lamentablemente no apareció.
FYI: Expect es una herramienta de automatización y prueba de Unix, escrita por Don Libes como una extensión del lenguaje de scripting Tcl, para aplicaciones interactivas como telnet, ftp, passwd, fsck, rlogin, tip, ssh y otras.
Compruebe esto rubygem: https://github.com/abates/ruby_expect . Podría manejar alguna pequeña tarea para ti. a partir de su ejemplo oficial, es suficiente para ''ingresar contraseña'' e iniciar sesión e interactuar con el script local.
Aquí hay un ejemplo que actualiza el código git (que se autentica con contraseña):
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
solo ejecuta el código de arriba, y verás así:
$ ruby update_code.rb
[email protected]??.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.
Para más ejemplos y detalles, por favor sumérjase en su código fuente.
Recientemente pasé bastante tiempo luchando con este problema (estoy atascado con 1.8.7). Encontré esta question , esta publicación de blog y este hilo de foro realmente útiles.
Al final, este es el código de mi aplicación, si alguien está interesado en un pequeño ejemplo (pase la contraseña a rpm al firmar paquetes):
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
Tiene poca comprobación de errores, pero era todo lo que necesitaba.
Edición: actualice el código con Process.wait(pid)
para asegurarse de que finaliza antes de continuar y agregue un comentario sobre este para 1.8.7.
Ruby viene con el módulo PTY para configurar pseudoterminales para manejar aplicaciones de línea de comandos interactivas. Con esto viene un método de expect
que le permite interactuar con una aplicación como Expect. Para aprender a usar expectativa, encontré útil " ¿Qué esperar de la biblioteca de Ruby expect? ".
En lo que se refiere a las gemas, tal vez a la salida de los greenletters que se supone que deben mejorar en PTY + espera (aunque yo no lo he probado).
Desde la página web del proyecto:
RExpect es un reemplazo del módulo expect.rb en la biblioteca estándar que es más rápido y más robusto, capaz de manejar muchos dispositivos simultáneamente.
parley es otro que puedes probar, (escrito por mí). Está inspirado en Perl espera.