Net :: SSH :: Multi mit der session.exec, wie bekommt man den Ausgang sofort? Rubin

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

  •  21-09-2019
  •  | 
  •  

Frage

So habe ich versucht, das Net :: SSH zu verwenden :: Multi Login auf mehrere Maschinen die über SSH verwenden, und dann Shell-Kommandos auf den Remote-Rechnern mit session.exec Ausführung ( „some_command“).

Der 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

Das Problem, das ich im Moment habe, ist, wenn ich einen Befehl in der interaktiven Eingabeaufforderung, die „session.exec“ nicht in den Ausgang zurückkehren util ich das Programm beenden, ich habe mich gefragt, ob jemand über dieses Problem gekommen ist und kann mir sagen, wie ich über die Lösung dieses Problems gehen kann?

War es hilfreich?

Lösung

Hinzufügen session.loop nach session.exec das Programm ermöglicht die Ausgabe zu warten.

Wie 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.

Andere Tipps

Werfen Sie einen Blick a hier . Die exec Methode scheint es das Ergebnis an den mitgelieferten Block zu erhalten.

Beispiel aus der Dokumentation:

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

Disclaimer: habe ich nicht getestet, diese selbst. Es kann funktionieren oder nicht. Lassen Sie uns wissen, wenn es funktioniert!

Nehmen Sie die while-Schleife und Anruf session.loop nach dem Aufruf von exec. So etwas wie folgt aus:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top