4 Stimmen

Net::SSH::Multi mit der session.exec, wie erhalten Sie die Ausgabe sofort? Ruby

Ich habe also versucht, Net::SSH::Multi zu verwenden, um mich über SSH bei mehreren Rechnern anzumelden und dann mit session.exec("some_command") Shell-Befehle auf den entfernten Rechnern auszuführen.

Der Kodex:

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

Das Problem, das ich im Moment habe, ist, dass, wenn ich einen Befehl in der interaktiven Eingabeaufforderung eingebe, die "session.exec" die Ausgabe nicht zurückgibt, wenn ich das Programm beende.

4voto

chutsu Punkte 13034

Das Hinzufügen von session.loop nach session.exec ermöglicht es dem Programm, auf die Ausgabe zu warten.

Zum Beispiel:

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

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

0voto

Christoph Schiessl Punkte 6778

Werfen Sie einen Blick auf aquí . Die exec Methode scheint ihr Ergebnis an den bereitgestellten Block zu übergeben.

Beispiel aus der Dokumentation:

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

Haftungsausschluss: Ich habe dies nicht selbst getestet. Es kann funktionieren oder auch nicht. Lassen Sie es uns wissen, wenn es funktioniert!

0voto

delano Punkte 135

Entfernen Sie die while-Schleife und rufen Sie session.loop nach dem Aufruf von exec auf. Etwa so:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X