我有以下代码尝试连接到使用 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() 行时,会引发以下异常:



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

谢谢

最佳答案

消息 80 代表 SSH_MSG_GLOBAL_REQUEST

现代版本的 OpenSSH 服务器将此通用消息用于各种 proprietary extensions of the SSH protocol

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

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

该问题已在 SSH.NET 2016.0.0-beta1 中修复。请参阅 Issue #8Commit a1f46d4

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

RegisterMessage("SSH_MSG_GLOBAL_REQUEST");

我会把它放在这一行下面:
RegisterMessage("SSH_MSG_USERAUTH_BANNER");

关于c# - SSH.NET - 消息类型 80 无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36892391/

10-14 17:02
查看更多