我正在尝试自动配置远程主机,我们有数百台这样的设备,我们通常是通过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>
为什么这似乎不能执行runcommand并将结果存储在输出变量中?
答案 0 :(得分:1)
对Renci.SshNet.SshClient类型的对象执行RunCommand()方法时,它不会将结果作为变量返回。 相反,它返回Renci.SshNet.SshCommand类型的对象。
问题是,看起来你不能将这个结果的SshCommand对象放入var。
执行RunCommand()时返回的Renci.SshNet.SshCommand将包含多个属性和方法。 属性是:
它们都很有用,但是当其他一切看起来都有效时,你想要的唯一相关的就是&#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,这将产生所需的结果。