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

SSH.NET doesn't process my shell input commands

我正在使用 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 stdout = Console.OpenStandardOutput();
            var shell = ssh.CreateShell(input, stdout, new MemoryStream());
            shell.Start();

            streamWriter.WriteLine("ls");
            
            while (true)
            {               
            }
        }
    }
}

有什么问题?

MemoryStream 不适合 class 实现输入流。

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

所以当SSH.NET通道尝试读取数据时,它没有任何可读取的数据。

您可以将指针向后移动:

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

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

var input = new PipeStream();

另一种选择是使用 SshClient.CreateShellStream (ShellStream class),它专为此类任务而设计。它给你一个 Stream 接口,你可以写和读。

另见


尽管 SshClient.CreateShell(SSH“shell”通道)不是自动执行命令的正确方法。使用“执行”频道。对于简单的情况,使用 SshClient.RunCommand。如果要连续读取命令输出,请使用 SshClient.CreateCommand 检索命令输出流:

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