Net :: ssh :: multi usando o session.exec, como você obtém a saída imediatamente? Rubi
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?
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