4

我正在尝试Solaris/Unix使用C#类连接到服务器以读取系统信息/配置、内存使用情况等。

我的要求是从 C# 应用程序(就像我们使用PuTTY客户端一样)在服务器上运行命令,并将响应存储在string变量中以供以后处理。

经过一番研究,我发现SharpSSH库可以用来做同样的事情。

当我尝试运行我的代码时,以下行给了我一个Auth Fail异常。我确信凭据(服务器名称、用户名和密码)是正确的,因为我能够PuTTY使用相同的凭据从客户端登录。

SshStream ssh = new SshStream(servername, username, password);

我究竟做错了什么?

如果有帮助,以下是堆栈跟踪!

at Tamir.SharpSsh.jsch.Session.connect(Int32 connectTimeout)  
at Tamir.SharpSsh.jsch.Session.connect()  
at Tamir.SharpSsh.SshStream..ctor(String host, String username, String password)   
4

1 回答 1

2

经过一番研究,我发现了一个 VB 代码,它为我指明了正确的方向。似乎为KeyboardInteractiveAuthenticationMethod帮助解决这个问题添加了一个额外的事件处理程序。希望这对其他人有帮助。

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

private bool connectToServer()
{
    try
    {
        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();
        return true;
        }
    catch (Exception ex)
    {
        if (null != sshClient && sshClient.IsConnected)
        {
            sshClient.Disconnect();
        }
        throw ex;
    }
}
于 2013-04-16T20:00:38.833 回答