8

AIXボックスに接続し、SSH.NETライブラリを使用していくつかのコマンドを実行しようとしています。以下はコードスニペットです

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

ConnectionInfo connectionInfo = new(ConnectionInfo(servername, 22, username, pauth,kauth);
SshClient sshClient = new SshClient(connectionInfo);
sshClient.Connect();
SshCommand sshCommand = sshClient.RunCommand("mpstat");
Console.WriteLine(sshCommand.Result);
Console.ReadKey();

回線に接続しようとすると、次の例外メッセージが表示されますsshClient.Connect()

{"値を null にすることはできません。\r\nパラメータ名: データ"}

スタックトレースは

   at Renci.SshNet.KeyboardInteractiveAuthenticationMethod.Authenticate(Session session)
   at Renci.SshNet.ConnectionInfo.Authenticate(Session session)
   at Renci.SshNet.Session.Connect()
   at Renci.SshNet.BaseClient.Connect()

同じ資格情報でクライアントを使用してログインできるため、渡す資格情報が有効であると確信しています。PuTTY何か案は?

4

2 に答える 2

15

いくつかの調査の結果、解決策を見つけました。それが他の誰かに役立つことを願っています。

キーボード インタラクティブ認証を使用AuthenticationPromptし、次の関数でイベントをオーバーライドする必要があります。

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

関数呼び出しコード:

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();
于 2013-03-28T17:09:39.177 に答える
1

使いやすいように全体をカプセル化しました。警告: try/catch はまだ実装されていません! DLL はこちらから入手できます: https://sshnet.codeplex.com/releases/view/120504 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;
        }
    }
}
于 2014-10-06T11:28:38.803 に答える