Net :: SSH :: Multi utilizzando il session.exec, come si fa a ottenere l'output subito? Rubino
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?
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