2017-06-13 1 views
2

J'utilise SSH.NET pour me connecter à mon Raspberry Pi à partir d'une application console en C#.SSH.NET ne traite pas mes commandes d'entrée de shell

Je veux envoyer du texte de mon flux propre, écrit à travers un StreamWriter.

Le problème est qu'il ne fait rien. C'est comme si le WriteLine("ls") ne produisait aucun effet.

Voici le 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) 
      {    
      } 
     } 
    } 
} 

Quel est le problème?

Merci d'avance :) est

+0

Pourquoi tu veux envoyer des messages texte à partir de votre propre flux? Il existe une méthode RunCommand pour le client SSH – Sybren

+0

Parce que je veux simuler un terminal sous UWP. Y a-t-il un bon moyen de le faire? – SuperJMN

+0

De plus, si j'utilise RunCommand, je ne peux pas obtenir la sortie de la commande tant que l'exécution n'est pas terminée. Imaginez combien de temps cela prendrait pour "apt-get update" par exemple. – SuperJMN

Répondre

3

MemoryStream est pas une bonne classe pour mettre en œuvre un flux d'entrée.

Lorsque vous écrivez à MemoryStream, comme avec la plupart des implémentations de flux, son pointeur est déplacé à la fin des données écrites.

Ainsi, lorsque le canal SSH.NET essaie de lire des données, il n'a rien à lire.

Vous pouvez déplacer le pointeur de retour:

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

Mais la bonne approche est d'utiliser PipeStream de SSH.NET, qui a lu séparément et écrire des pointeurs (comme un * tuyau nix):

var input = new PipeStream(); 

Une autre option consiste à utiliser SshClient.CreateShellStream (ShellStream class), qui est conçu pour tâche comme celui-ci. Il vous donne une interface Stream, que vous pouvez écrire et lire.

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


Bien que SshClient.CreateShell (SSH canal "shell") n'est pas la bonne méthode pour automatiser l'exécution de la commande. Utilisez le canal "exec". Pour les cas simples, utilisez SshClient.RunCommand. Si vous voulez lire une sortie de commande en continu, utilisez SshClient.CreateCommand pour récupérer le flux de sortie de commande:

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

Un grand merci! Ça a marché, maintenant que ça marche je voudrais aller plus loin. C'est une autre question: https://stackoverflow.com/questions/44549443/ssh-net-based-colored-terminal-emulator – SuperJMN

+0

Par ailleurs, tout le code est en ligne et open source. C'est ici que vous devriez jeter un coup d'oeil! https://github.com/SuperJMN/UniversalSSH – SuperJMN