我正在尝试自动配置远程主机,我们有成百上千个这样的设备,我们通常通过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分钟后超时并丢失连接,这也可以在设备日志中看到。
为什么这似乎不执行runcommand并将结果存储在输出变量中?
最佳答案
当您对Renci.SshNet.SshClient类型的对象执行RunCommand()方法时,它不会将结果作为变量返回。
而是,它返回Renci.SshNet.SshCommand类型的对象。
问题在于,您似乎无法将所得的SshCommand对象放入var中。
执行RunCommand()时返回的此Renci.SshNet.SshCommand将包含多个属性和方法。
这些属性是:
它们都很有用,但是由于其他所有功能似乎都在起作用,因此您想要的唯一相关的是“结果”。
“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/