SSH.NET不处理我的shell输入命令

时间:2017-06-13 17:39:25

标签: c# .net ssh stream ssh.net

我使用SSH.NET从C#中的控制台应用程序连接到我的Raspberry Pi。

我想从我自己的流发送文字,通过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)
            {               
            }
        }
    }
}

问题是什么?

谢谢你提前:)

1 个答案:

答案 0 :(得分:5)

MemoryStream不是实现输入流的好类。

当你写入MemoryStream时,与大多数流实现一样,它的指针会在写入数据的末尾移动。

因此,当SSH.NET频道尝试读取数据时,无需阅读。

您可以将指针移回:

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

但正确的方法是使用SSH.NET中的PipeStream,它具有单独的读写指针(就像* nix管道一样):

var input = new PipeStream();

另一种选择是使用SshClient.CreateShellStreamShellStream class),这是专为此类任务而设计的。它为您提供了一个Stream接口,您可以编写和读取。

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

虽然SshClient.CreateShell(SSH" shell" channel)不是自动执行命令的正确方法。使用" exec"渠道。对于简单的情况,请使用SshClient.RunCommand。如果要连续读取命令输出,请使用SshClient.CreateCommand检索命令输出流:

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