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.CreateShellStream
( ShellStream
类 ),它是为这样的任务设计的。 它为您提供了一个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);