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

我正在使用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) { } } } } 

有什么问题?

谢谢是提前:)

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

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

因此,当SSH.NET通道尝试读取数据时,它没有任何东西可读。

你可以将指针移回:

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

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

 var input = new PipeStream(); 

另一个选择是使用SshClient.CreateShellStreamShellStream类 ),它是为这样的任务设计的。 它为您提供了一个Stream接口,您可以进行写入和读取。

另请参见使用SSH.NET从单个登录会话执行多个SSH命令是否可行?


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

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