Net :: SSH :: Multi utilizando el session.exec, ¿cómo se obtiene la salida de inmediato? Rubí
Pregunta
Así que he estado tratando de utilizar la Red :: SSH :: Multi Para acceder a múltiples máquinas que utilizan la vía SSH, y luego ejecutar los comandos de shell en las máquinas remotas con session.exec ( "some_command").
El código:
#!/usr/bin/ruby
require 'rubygems'
require 'net/ssh'
require 'net/ssh/multi'
Net::SSH::Multi.start do |session|
# Connect to remote machines
### Change this!!###
session.use 'user@server'
loop = 1
while loop == 1
printf(">> ")
command = gets.chomp
if command == "quit" then
loop = 0
else
session.exec(command)do |ch, stream, data|
puts "[#{ch[:host]} : #{stream}] #{data}"
end
end
end
end
El problema que tengo en este momento, es cuando entro en un comando en el, la "session.exec" modo interactivo, no devuelve la salida util que salir del programa, me preguntaba si alguien ha encontrado con este problema y me puede decir cómo puedo ir sobre la solución de este problema?
Solución
Adición session.loop después session.exec permite que el programa que esperar a la salida.
Tales como:
session.exec(command)do |ch, stream, data|
puts "[#{ch[:host]} : #{stream}] #{data}"
end
session.loop
# Or session.wait also does the same job.
Otros consejos
Tome un vistazo a aquí . El método exec
parece producir el mismo de resultado al bloque suministrado.
Ejemplo de la documentación:
session.exec("command") do |ch, stream, data|
puts "[#{ch[:host]} : #{stream}] #{data}"
end
Negación: no he probado esto por mí mismo. Es posible que funcione o no. Háganos saber si funciona!
Eliminar el bucle while y session.loop llamada después de la llamada a Exec. Algo como esto:
Net::SSH::Multi.start do |session|
# Connect to remote machines
### Change this!!###
session.use 'user@server'
session.exec(command)do |ch, stream, data|
puts "[#{ch[:host]} : #{stream}] #{data}"
end
# Tell Net::SSH to wait for output from the SSH server
session.loop
end