Net :: ssh :: multi usando o session.exec, como você obtém a saída imediatamente? Rubi

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

  •  21-09-2019
  •  | 
  •  

Pergunta

Então, eu tenho tentado usar o net :: ssh :: multi para fazer login em várias máquinas usando o via ssh e executar comandos do shell nas máquinas remotas com session.exec ("some_command").

O 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

O problema que tenho no momento, é quando entro em um comando no prompt interativo, o "session.exec" não retorna o uso de saída, deixei o programa, fiquei me perguntando se alguém encontrou esse problema e posso me dizer Como posso resolver esse problema?

Foi útil?

Solução

Adicionar session.loop após session.exec permite que o programa aguarde a saída.

Tal como:

session.exec(command)do |ch, stream, data|
  puts "[#{ch[:host]} : #{stream}] #{data}"
end

session.loop
# Or session.wait also does the same job.

Outras dicas

Dê uma olhada um aqui. o exec O método parece produzir seu resultado para o bloco fornecido.

Exemplo da documentação:

session.exec("command") do |ch, stream, data|
  puts "[#{ch[:host]} : #{stream}] #{data}"
end

Isenção de responsabilidade: eu não testei isso sozinho. Pode funcionar ou não. Avise -nos quando funcionar!

Remova o loop while e chame session.loop após a chamada para exec. Algo assim:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top