Net :: SSH de multi utilisant le session.exec, comment obtenez-vous immédiatement la sortie? Rubis
Question
J'ai donc essayé d'utiliser le Net :: SSH de multi pour vous connecter à plusieurs ordinateurs en utilisant le via SSH, puis d'exécuter des commandes shell sur les machines distantes avec session.exec ( « une_commande »).
Le code:
#!/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
Le problème que j'ai en ce moment, est quand j'entrer une commande dans l'invite interactive, la « session.exec » ne retourne pas la sortie util je quitte le programme, je me demandais si quelqu'un a rencontré ce problème et peut me dire comment je peux aller sur la résolution de ce problème?
La solution
Ajout session.loop après session.exec permet au programme d'attendre la sortie.
Tels que:
session.exec(command)do |ch, stream, data|
puts "[#{ch[:host]} : #{stream}] #{data}"
end
session.loop
# Or session.wait also does the same job.
Autres conseils
un coup d'oeil un . La méthode exec
semble donner son résultat au bloc fourni.
Exemple de la documentation:
session.exec("command") do |ch, stream, data|
puts "[#{ch[:host]} : #{stream}] #{data}"
end
Disclaimer: Je n'ai pas testé moi-même. Il peut fonctionner ou non. Faites-nous savoir quand il fonctionne!
Supprimer la boucle while et appeler session.loop après l'appel à exec. Quelque chose comme ceci:
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