4

我有以下代码尝试连接到使用 OpenSSH 构建的 SFTP 服务器(服务器工作,因为我已经能够通过 WinSCP 客户端成功连接到这个 FTP):

ConnectionInfo ConnNfo = new ConnectionInfo("127.0.0.1", 22, "usertest",
    new AuthenticationMethod[]{

        // Pasword based Authentication
        new PasswordAuthenticationMethod("usertest","usertest"),
    }
);

// Upload A File
using (var sftp = new SftpClient(ConnNfo))
{
    sftp.Connect();
    sftp.ChangeDirectory(@"/C:/IISFTP/");
    using (var uplfileStream = File.OpenRead(uploadfn))
    {
        sftp.UploadFile(uplfileStream, uploadfn, true);
    }
    sftp.Disconnect();
}

调用该sftp.Connect()行时,会引发以下异常:

消息类型 80 无效

为什么会这样?如何使用 SSH.NET 连接到我的 SFTP 服务器?

谢谢

4

1 回答 1

7

消息 80 代表SSH_MSG_GLOBAL_REQUEST.

现代版本的 OpenSSH 服务器将此通用消息用于SSH 协议的各种专有扩展

大多数客户端将/应该默默地忽略无法识别的消息。SSH.NET 也确实忽略了SSH_MSG_GLOBAL_REQUEST该消息,但在身份验证完成之前它不会收到该消息。

不幸的是,OpenSSH 似乎hostkeys-prove-00@openssh.com甚至在身份验证之前就发送了其中的一些(可能是 )。

该问题已在SSH.NET 2016.0.0-beta1中得到修复。请参阅问题 #8提交 a1f46d4


在旧版本中,转到Session.cs并在Session.Connect()方法中将下面的行稍微向上移动到身份验证代码上方:

RegisterMessage("SSH_MSG_GLOBAL_REQUEST");

我会把它放在这条线的下面:

RegisterMessage("SSH_MSG_USERAUTH_BANNER");

于 2016-04-27T14:47:54.163 回答