gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:17:34 25 4
gpt4 key购买 nike

我正在使用 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 不是实现输入流的好类。

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

因此,当 SSH.NET channel 尝试读取数据时,它没有任何可读取的数据。

您可以将指针向后移动:

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

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

var input = new PipeStream();

另一种选择是使用 SshClient.CreateShellStream(ShellStream 类),它专为此类任务而设计。它为您提供一个 Stream 接口(interface),您既可以写入也可以读取。

另见 Is it possible to execute multiple SSH commands from a single login session with SSH.NET?


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

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

关于c# - SSH.NET 不处理我的 shell 输入命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44528158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com