2017-06-13 13 views
2

私はSSH.NETを使用してC#のコンソールアプリケーションから自分のRaspberry Piに接続しています。SSH.NETはシェル入力コマンドを処理しません

私のストリームを自分のストリームからStreamWriterに書き込んで送ってください。

問題は何もしないということです。 WriteLine("ls")のような効果はありません。

これはコードです:

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

問題は何?

おかげで、事前:)

+0

なぜuは、独自のストリームからテキストを送信したいですか? SSHクライアントのRunCommandメソッドがあります – Sybren

+0

UWPの下で端末をシミュレートしたいからです。それを行う良い方法はありますか? – SuperJMN

+0

また、RunCommandを使用すると、実行が完了するまでコマンドの出力を取得できません。例えば「apt-get update」のためにどれくらいの時間がかかるか想像してみてください。 – SuperJMN

答えて

3

MemoryStreamは、入力ストリームを実装するための良いクラスではありません。

ほとんどのストリーム実装と同様に、MemoryStreamに書き込むと、そのポインタは書き込まれたデータの最後に移動します。

SSH.NETチャネルがデータを読み取ろうとすると、読み取ることはありません。

あなたは戻って、ポインタを移動することができます。

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

しかし、正しいアプローチは、(ちょうど* nixのパイプとして)別々の読み取りと書き込みのポインタを持っているSSH.NETからPipeStreamを使用することです:

var input = new PipeStream(); 

別のオプションは、このようなタスクのために設計された、SshClient.CreateShellStreamShellStream class)を使用することです。 1つのStreamインターフェイスがあり、書き込みと読み取りの両方が可能です。

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


SshClient.CreateShellけど(SSH "シェル" チャネル)コマンドの実行を自動化するための正しい方法ではありませんを参照してください。 「exec」チャネルを使用します。単純な場合は、SshClient.RunCommandを使用します。あなたが継続的にコマンドの出力を読みたい場合は、コマンドの出力ストリームを取得するためにSshClient.CreateCommandを使用します。

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

大きな感謝!それは機能したので、私はさらに進めたいと思いました。これは別の質問です:https://stackoverflow.com/questions/44549443/ssh-net-based-colored-terminal-emulator – SuperJMN

+0

ところで、すべてのコードはオンラインでオープンソースです。それはあなたが一見をしたいと思うべきであるここにある! https://github.com/SuperJMN/UniversalSSH – SuperJMN

関連する問題