使用SSH.NET连接到远程主机

时间:2016-10-19 05:36:53

标签: c# ssh ssh.net

我正在尝试自动配置远程主机,我们有数百台这样的设备,我们通常是通过USB编程实现的,但是如果我可以通过脚本连接到这些设备并以编程方式进行,那么可以节省时间。

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

目前,我只想尝试与设备建立SSH会话。我做了很多研究,并提出了这个问题:

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分钟后超时并且连接丢失,我也会在设备日志中看到。< / p>

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

1 个答案:

答案 0 :(得分:1)

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

问题是,看起来你不能将这个结果的SshCommand对象放入var。

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

  • 的CommandText
  • 的CommandTimeout
  • 退出状态
  • 的OutputStream
  • ExtendedOutputStream
  • 结果
  • 错误

它们都很有用,但是当其他一切看起来都有效时,你想要的唯一相关的就是&#34;结果&#34;。 &#34;结果&#34; property将包含一个String,它将是您向RunCommand()提供的命令的主机流结果。

正如您所提到的,设备的日志文件已记录成功连接,看起来连接成功。所以你只需要进行适当的调整就可以获得结果,如上所述,你应该好好去。

附录:

原帖后面的代码:

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

应替换为此代码:

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

这会将Result属性(这是一个String)分配给output var,这将产生所需的结果。