2017-06-13 2 views
2

Ich verwende SSH.NET, um eine Verbindung zu meinem Raspberry Pi über eine Konsolenanwendung in C# herzustellen.SSH.NET verarbeitet meine Shell-Eingabebefehle nicht

Ich möchte Text senden von meinem eigenen Stream, Schreiben über eine StreamWriter.

Das Problem ist, dass es nichts tut. Es ist wie die WriteLine("ls") keinen Effekt erzeugt.

Dies ist der Code:

using System; 
using System.IO; 
using Renci.SshNet; 

namespace SSHTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      var ssh = new SshClient("raspberrypi", 22, "pi", "raspberry"); 
      ssh.Connect(); 

      var input = new MemoryStream(); 
      var streamWriter = new StreamWriter(input) { AutoFlush = true }; 

      var shell = 
       ssh.CreateShell(input, Console.OpenStandardOutput(), new MemoryStream()); 
      shell.Start(); 

      streamWriter.WriteLine("ls"); 

      while (true) 
      {    
      } 
     } 
    } 
} 

Was ist das Problem?

Dank ist Voraus :)

+0

Warum wollen u Text von Ihrem eigenen Stream senden? Es gibt eine RunCommand-Methode für den SSH-Client – Sybren

+0

Da ich ein Terminal unter UWP simulieren möchte. Gibt es einen guten Weg, es zu tun? – SuperJMN

+0

Außerdem, wenn ich RunCommand verwende, kann ich die Ausgabe des Befehls nicht erhalten, bis die Ausführung beendet ist. Stellen Sie sich vor, wie lange es beispielsweise für "apt-get update" dauern würde. – SuperJMN

Antwort

3

MemoryStream zur Umsetzung eines Eingangsstroms nicht eine gute Klasse.

Wenn Sie wie bei den meisten Stream-Implementierungen in MemoryStream schreiben, wird der Zeiger am Ende der geschriebenen Daten verschoben.

Also wenn SSH.NET-Kanal versucht, Daten zu lesen, hat es nichts zu lesen.

können Sie den Zeiger bewegen zurück:

streamWriter.WriteLine("ls"); 
input.Position = 0; 

Aber der richtige Ansatz ist PipeStream von SSH.NET zu verwenden, die getrennte Lese- und Schreibzeiger (nur als * nix-Rohr):

var input = new PipeStream(); 

Eine weitere Option ist SshClient.CreateShellStream (ShellStream class) zu verwenden, die für die Aufgabe wie folgt ausgelegt ist. Es gibt Ihnen eine Stream Schnittstelle, die Sie sowohl schreiben als auch lesen können.

Siehe Is it possible to execute multiple SSH commands from a single login session with SSH.NET?


Obwohl SshClient.CreateShell auch (SSH "shell" Kanal) für die Automatisierung der Befehlsausführung nicht die richtige Methode. Verwenden Sie den "Exec" -Kanal. In einfachen Fällen verwenden Sie SshClient.RunCommand. Wenn Sie eine Befehlsausgabe kontinuierlich lesen möchten, verwenden Sie den Befehl SshClient.CreateCommand Ausgabestrom abzurufen:

var command = ssh.CreateCommand("ls"); 
var asyncExecute = command.BeginExecute(); 
command.OutputStream.CopyTo(Console.OpenStandardOutput()); 
command.EndExecute(asyncExecute); 
+0

Vielen Dank! Es hat funktioniert, jetzt, wo es funktioniert, würde ich gerne weiter gehen. Dies ist eine andere Frage: https://stackoverflow.com/questions/44549443/ssh-net-based-colored-terminal-emulator – SuperJMN

+0

Übrigens ist der gesamte Code online und Open Source. Hier sollten Sie einen Blick werfen! https://github.com/SuperJMN/UniversalSSH – SuperJMN

Verwandte Themen