Unable to connect to AIX(Unix) box with SSH.NET Library - Error : Value cannot be null

為{幸葍}努か 提交于 2019-11-29 04:19:47

I found the solution after some research. Hope it helps somebody else.

The keyboard interactive authentication should be used and AuthenticationPrompt event should be overridden with the following function

void HandleKeyEvent(Object sender, AuthenticationPromptEventArgs e)
{
    foreach (AuthenticationPrompt prompt in e.Prompts)
    {
        if (prompt.Request.IndexOf("Password:", StringComparison.InvariantCultureIgnoreCase) != -1)
        {
            prompt.Response = password;
        }
    }
}

The function call code :

KeyboardInteractiveAuthenticationMethod kauth = new KeyboardInteractiveAuthenticationMethod(username);
PasswordAuthenticationMethod pauth = new PasswordAuthenticationMethod(username, password);

kauth.AuthenticationPrompt += new EventHandler<AuthenticationPromptEventArgs>(HandleKeyEvent);

ConnectionInfo connectionInfo = new ConnectionInfo(serverName, port, username, pauth, kauth);

sshClient = new SshClient(connectionInfo);
sshClient.Connect();
sheepchen

I've encapsulated the whole thing so that it's easier to use. Warning: no try/catch has been implemented yet! The DLL is available here: https://sshnet.codeplex.com/releases/view/120504 Tested with SLES (11.1 64), Debian (6), AIX (5.3, 6.1, 7)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using Renci.SshNet;
using Renci.SshNet.Common;

namespace SSH2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            SSH client = new SSH("servername", "username", "password");

            MessageBox.Show(client.command("ls -la /"));
        }

    }

    public class SSH
    {
        string servername;
        int port;
        string username;
        string password;

        SshClient Server = null;


        public SSH(string servername, int port, string username, string password)
        {
            this.servername = servername;
            this.port = port;
            this.username = username;
            this.password = password;

            this.init();
        }

        public SSH(string servername, string username, string password)
        {
            this.servername = servername;
            this.port = 22;
            this.username = username;
            this.password = password;

            this.init();
        }


        private void init()
        {
            KeyboardInteractiveAuthenticationMethod kauth = new KeyboardInteractiveAuthenticationMethod(this.username);
            PasswordAuthenticationMethod pauth = new PasswordAuthenticationMethod(this.username, this.password);

            kauth.AuthenticationPrompt += new EventHandler<AuthenticationPromptEventArgs>(HandleKeyEvent);

            this.Server = new SshClient(new ConnectionInfo(this.servername, this.port, this.username, pauth, kauth));
        }


        void HandleKeyEvent(Object sender, AuthenticationPromptEventArgs e)
        {
            foreach (AuthenticationPrompt prompt in e.Prompts)
            {
                if (prompt.Request.IndexOf("Password:", StringComparison.InvariantCultureIgnoreCase) != -1)
                {
                    prompt.Response = this.password;
                }
            }
        }

        public string command(string cmd)
        {
            this.Server.Connect();

            var output = this.Server.RunCommand(cmd);

            this.Server.Disconnect();

            return output.Result;
        }
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!