我使用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)
{
}
}
}
}
问题是什么?
谢谢你提前:)
答案 0 :(得分:5)
MemoryStream
不是实现输入流的好类。
当你写入MemoryStream
时,与大多数流实现一样,它的指针会在写入数据的末尾移动。
因此,当SSH.NET频道尝试读取数据时,无需阅读。
您可以将指针移回:
streamWriter.WriteLine("ls");
input.Position = 0;
但正确的方法是使用SSH.NET中的PipeStream
,它具有单独的读写指针(就像* nix管道一样):
var input = new PipeStream();
另一种选择是使用SshClient.CreateShellStream
(ShellStream
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);