我试图自动配置远程主机,我们有数百台这样的设备,我们通常通过USB编程来实现,但是如果我能得到一个脚本来连接到这些设备,并以编程的方式完成,它将释放时间。
这些设备运行某种类型的linux,我不确定,但它们确实启用了SSH,并在您首次通过PuTTY等实用工具连接到它们时确认了服务器主机密钥。
现在,我只是尝试启动一个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分钟后连接超时,连接丢失,我也会在设备日志中看到这种情况。
为什么这似乎不执行run命令并将结果存储在输出变量中?
发布于 2017-03-03 20:26:31
当对类型为RunCommand()的对象执行Renci.SshNet.SshClient ()方法时,它不会将结果作为变量返回。相反,它返回一个Renci.SshNet.SshCommand类型的对象。
问题是,您似乎无法将这个结果的SshCommand对象放入变量中。
执行Renci.SshNet.SshCommand ()时返回的这个RunCommand将包含几个属性和方法。这些财产是:
它们都是有用的,但由于其他东西似乎都在起作用,你唯一想要的是“结果”。“结果”属性将包含一个字符串,它将是您向RunCommand()提供的命令的主机流结果。
正如您提到的,设备的日志文件记录了一个成功的连接,看起来连接是成功的。因此,您只需作出适当的调整,以获取结果,如上文所述,您应该是好的。
增编:
原始文章代码中的以下一行:
var output = client.RunCommand("show device details");
应该用以下代码替换:
var output = client.RunCommand("show device details").Result;
这将将结果属性(是字符串)分配给output
变量,这将给出所需的结果。
https://stackoverflow.com/questions/40122979
复制相似问题