Using SSH.NET to connect to Remote Hosts

13,102

When you execute the RunCommand() method on an object of type Renci.SshNet.SshClient, it does not return the result as a variable. Instead, it returns an object of the Renci.SshNet.SshCommand type.

The issue is that, it looks like you can't fit this resultant SshCommand object into a var.

This Renci.SshNet.SshCommand, returned when you execute RunCommand(), will contain several properties and methods. The properties are:

  • CommandText
  • CommandTimeout
  • ExitStatus
  • OutputStream
  • ExtendedOutputStream
  • Result
  • Error

They're all useful, but as everything else seems to be working, the only relevant one you want is "Result". The "Result" property will contain a String, which will be the host stream result of the command you provided to RunCommand().

As you mention the device's logfile has logged a successful connection being made, it looks like the connection is successful. So you'd just have to make the proper tweak to grab the Result, as described above, and you should be good to go.

Addendum:

The following line in the original post's code:

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

Should be replaced with this code:

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

This will assign the Result property (which is a String) to the output var, which will give the desired outcome.

Share:
13,102

Related videos on Youtube

suddenlyNate
Author by

suddenlyNate

Updated on June 04, 2022

Comments

  • suddenlyNate
    suddenlyNate almost 2 years

    I'm trying to automate configuring remote hosts, we have hundreds of these devices, we normally do it through USB programming, but if I could get a script to connect to these devices and do it programmatically, it would free up time.

    These devices run some type of linux os, i'm not sure exactly, but they do have SSH enabled and confirm server host keys when you first connect to them via utility like PuTTY.

    For now, i'm just trying to initiate an SSH session with the device. I've done quite a bit of research, and have come up with this:

    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();
                }
            }
        }
    }
    

    The problem is this doesn't seem to execute the command listed. The console window comes up, and I can access the same device by WebGUI and see the log file, it shows a connection being made, but when I break the execution and see the variable values the output variable shows null.

    If I let the execution sit, with the console window open (just shows a blinking cursor in the upper left), the connection times out after 10 minutes and connection is lost, which I also see happen in the device log.

    Why would does this not seem to execute the runcommand and store the results in the output variable?

    • yaKashif
      yaKashif over 7 years
      These devices may not support ssh exec requests. Try running ssh admin@host 'show device details' from the command line and see if you get the expected output.
  • parthraj panchal
    parthraj panchal over 3 years
    im trying it on firewall. Which gives me options like to select 1 or 2 or 3.. How can send selection from listed menu given by firewall? I have tried RunCommand("2") but its not working