我正在尝试自动配置远程主机,我们有成百上千个这样的设备,我们通常通过USB编程来完成,但是如果我可以获取脚本来连接到这些设备并以编程方式进行操作,则可以节省时间。

这些设备运行某种类型的linux操作系统,我不确定,但是当您第一次通过PuTTY之类的实用程序连接到服务器时,它们确实启用了SSH并确认服务器主机密钥。

目前,我只是尝试与设备启动SSH session 。我已经做了很多研究,并提出了以下建议:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Renci.SshNet;
using Renci.SshNet.Common;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //Connection information
            string user = "admin";
            string pass = "********";
            string host = "IP Address";

            //Set up the SSH connection
            using (var client = new SshClient(host, user, pass))
            {

                //Accept Host key
                client.HostKeyReceived += delegate (object sender, HostKeyEventArgs e)
                {
                    e.CanTrust = true;
                };

                //Start the connection
                client.Connect();

                var output = client.RunCommand("show device details");


                client.Disconnect();
                Console.WriteLine(output.ToString());
                Console.ReadLine();
            }
        }
    }
}

问题是这似乎没有执行列出的命令。控制台窗口打开,我可以通过WebGUI访问同一设备并查看日志文件,它显示正在建立连接,但是当我中断执行并看到变量值时,输出变量显示为null。

如果让执行程序坐下来,在控制台窗口打开的情况下(仅在左上方显示一个闪烁的光标),连接将在10分钟后超时并丢失连接,这也可以在设备日志中看到。

为什么这似乎不执行runco​​mmand并将结果存储在输出变量中?

最佳答案

当您对Renci.SshNet.SshClient类型的对象执行RunCommand()方法时,它不会将结果作为变量返回。
而是,它返回Renci.SshNet.SshCommand类型的对象。

问题在于,您似乎无法将所得的SshCommand对象放入var中。

执行RunCommand()时返回的此Renci.SshNet.SshCommand将包含多个属性和方法。
这些属性是:

  • CommandText
  • CommandTimeout
  • ExitStatus
  • OutputStream
  • ExtendedOutputStream
  • 结果
  • 错误

  • 它们都很有用,但是由于其他所有功能似乎都在起作用,因此您想要的唯一相关的是“结果”。
    “Result”属性将包含一个String,这将是您提供给RunCommand()的命令的主机流结果。

    正如您提到的,设备的日志文件记录了建立成功的连接,看起来连接成功。因此,如上所述,您只需要进行适当的调整即可获取结果,并且您应该很好。

    附录:

    原始帖子代码中的以下行:
    var output = client.RunCommand("show device details");
    

    应替换为以下代码:
    var output = client.RunCommand("show device details").Result;
    

    这会将Result属性(它是一个字符串)分配给output var,这将提供所需的结果。

    关于c# - 使用SSH.NET连接到远程主机,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40122979/

    10-14 16:05
    查看更多