2017-01-18 4 views
1

Ich verbinde mich mit einem Server, möchte einen Befehl ausführen und die Ausgabe drucken. Hier ist der Code:Keine Ausgabe/Ergebnis eines SSH-Befehls

def log_in 
    Net::SSH.start('hostname', 'username', :password => "password") do |ssh| 
    ssh.open_channel do |channel| 
     output = channel.exec "ls" do |ch, success, data| 
     if success then 
      alert "Result: #{output} #{success} #{data}" 
     end 
     end 
    end 
    end 
end 

Das Ergebnis ist „Output“ ist eine leere Liste [], „Erfolg“ wahr und „Daten“ leer zu sein. Offensichtlich sollte dies nicht der Fall sein, da, wenn ich über das Terminal eingeloggt bin und den Befehl "ls" anklicke, mehrere Dateien/Ordner aufgelistet sind. Wo ist mein Fehler?

Interessanterweise, wenn ich Kauderwelsch als Befehl senden, z. anstelle von "ls" sende ich "asdfgh", es gibt dasselbe ([], wahr, leer) zurück. Verwenden von Schuhen/Ruby.

Antwort

1

Werfen Sie einen Blick auf die docs. Der Block, den Sie als zweites Argument an die exec-Methode übergeben, erwartet nur zwei Argumente ch und success. Sie müssen sicherstellen, dass Sie einen Rückruf hinzufügen, der ausgelöst wird, sobald die Daten verfügbar sind. Zum Beispiel:

channel.on_data do |ch, data| 
    puts "got stdout: #{data}" 
end 

Sie können auch ssh.exec Methode verwenden.

1

Dies funktioniert:

Net::SSH.start('hostname', username, :password => password) do |ssh| 
    ssh.open_channel do |channel| 
    output = channel.exec "ls" do |ch, success, data| 
     if success then 
     channel.on_data do |ch, data| 
      alert "#{data}" 
     end 
     end 
    end 
    end 
    ssh.loop 
end 

Ausgabe war, dort eine Begrüßungsnachricht vor bei der Anmeldung (und die erste Zeile ist leer). Der "ssh.loop" ermöglicht es, alle Zeilen der Willkommensnachricht und schließlich das Ergebnis des Befehls "ls" zu durchlaufen.

Verwandte Themen