Net :: SSH :: Multi utilizando el session.exec, ¿cómo se obtiene la salida de inmediato? Rubí

StackOverflow https://stackoverflow.com/questions/1383282

  •  21-09-2019
  •  | 
  •  

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?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top