SSH.NET - 消息类型 80 无效
Posted
技术标签:
【中文标题】SSH.NET - 消息类型 80 无效【英文标题】:SSH.NET - Message type 80 is not valid 【发布时间】:2016-08-21 21:40:02 【问题描述】:我有以下代码尝试连接到使用 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 服务器?
谢谢
【问题讨论】:
您的代码适用于我刚刚尝试过的 solaris 盒子 - 有一条消息说另一个 ssh 库有问题的 openssh.. 但它是一个较旧的.. 什么版本的 OpenSSH 和什么版本的 SSH.NET? @MartinPrikryl SSH.Net 版本:尝试了最新的源代码和 Nuget 包(在撰写本文时为 v2013.4.7)。 OpenSSH(我做了一个 ssh -v localhost):OpenSSH_7.1p1 Microsoft_Win32_port_with_VS,OpenSSL 1.0.2d 2015 年 7 月 9 日 我今天发布了 SSH.NET 的 beta 版 2016.0.0-beta1,修复了这个问题:>* 成功验证后立即收到 SSH_MSG_GLOBAL_REQUEST 时的竞争条件(GitHub 问题 #8)预发布版 NuGet 包可用here。 【参考方案1】:消息 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 #8 和Commit a1f46d4。
在旧版本中,转到Session.cs
并在Session.Connect()
方法中将下面的行向上移动,位于身份验证代码上方:
RegisterMessage("SSH_MSG_GLOBAL_REQUEST");
我会把它放在这条线的下面:
RegisterMessage("SSH_MSG_USERAUTH_BANNER");
【讨论】:
太棒了,根据您对源代码更改的建议,我终于可以绕过该错误并进行连接。现在我可以继续玩我认为的图书馆了。谢谢! 谢谢。有谁知道这个项目是否仍在积极进行中?也许是时候把它移到 Github 上了? @antmeehan 实际上已经被移动了:github.com/sshnet/SSH.NET。我已将此问题提交给项目:github.com/sshnet/SSH.NET/issues/8以上是关于SSH.NET - 消息类型 80 无效的主要内容,如果未能解决你的问题,请参考以下文章
SAAJ0537:无效的内容类型。可能是错误消息而不是 SOAP 消息
google 的从 c# 到 java 的协议缓冲区 - 协议消息标签的线路类型无效
错误消息:“float”和“int”类型的无效操作数到二进制“operator%”
Spring Security Oauth2 客户端获取访问令牌失败,请求代码无效=415,消息=不支持的媒体类型
SQL 消息无效的列类型:没有为类 oracle.jdbc.driver.T4CLongRawAccessor 实现 getBLOB