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