Net :: SSH :: Multi utilizzando il session.exec, come si fa a ottenere l'output subito? Rubino

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

  •  21-09-2019
  •  | 
  •  

Domanda

Così ho cercato di utilizzare la Net :: SSH :: Multi per accedere per più macchine utilizzando la via SSH, e quindi l'esecuzione di comandi di shell sulle macchine remote con session.exec ( "some_command").

Il codice:

#!/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

Il problema che ho in questo momento, è quando entro in un comando nel prompt interattivo, il "session.exec" non restituisce l'output util ho lasciato il programma, mi chiedevo se qualcuno ha incontrato questo problema e può dirmi come posso fare per risolvere questo problema?

È stato utile?

Soluzione

L'aggiunta di session.loop dopo session.exec permette al programma di attendere per l'uscita.

Come ad esempio:

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

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

Altri suggerimenti

Date un'occhiata a qui . Il metodo exec sembra produrre è risultato al blocco fornito.

Esempio dalla documentazione:

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

Disclaimer: Non ho prove io stesso. Esso può funzionare o meno. Fateci sapere quando funziona!

Rimuovi il ciclo while e chiamare session.loop dopo la chiamata a exec. Qualcosa di simile a questo:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top