Net :: SSH de multi utilisant le session.exec, comment obtenez-vous immédiatement la sortie? Rubis

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

  •  21-09-2019
  •  | 
  •  

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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top