在C#中连接到AWS Managed SFTP服务器时SSH.NET超时

吉姆

我在尝试建立与AWS Managed SFTP服务器的连接时遇到问题。使用现有的凭据,我可以使用以下sftp命令从Windows命令行连接到服务器这是我的.NET代码:

using (var client = new SshClient(new ConnectionInfo(baseHost, user,
            new AuthenticationMethod[]{
                new PrivateKeyAuthenticationMethod(user,new PrivateKeyFile[]{
                    new PrivateKeyFile(keyLocation, pkpassword)
                }),
            }
        )))
{
    client.Connect(); // Timeout here
}

上面的代码到达该client.Connect()行,然后在30秒后超时,但有一个Renci.SshNet.Common.SshOperationTimeoutException例外。当我查看Wireshark的情况时,我发现sftp命令行实用程序使用的协议是SSH,而SSH.NET使用TCP,并且数据包大小完全不同。

有人知道我在这里可能会想念的吗?

我在sftp与上述代码相同的计算机上运行命令行实用程序。下面的第一个Wireshark图像来自上面的C#代码。第二个来自sFTP实用程序:

Wireshark从C#代码捕获

sFTP实用程序中的Wireshark Capture

当我尝试在原始模式下使用PuTTY连接到服务器的端口22时,没有任何响应。

谢谢,吉姆

马丁·普里克里(Martin Prikryl)

根据RFC 4253第4.2节。协议版本交换

建立连接后,双方必须发送一个识别字符串。

Both SSH.NET client and Amazon Managed SFTP server fail this requirement. Both first wait for the other side to send the identification string before sending its own. A deadlock is inevitable (interrupted only by a timeout). That also explains why Wireshark does not identify the session as SSH, as there's no data exchanged at all. Hence, there's nothing by which the protocol can be identified.

If you can modify SSH.NET source code, moving this line in Session.Connect:

SocketAbstraction.Send(_socket, Encoding.UTF8.GetBytes(string.Format(CultureInfo.InvariantCulture, "{0}\x0D\x0A", ClientVersion)));

... above this block:

Match versionMatch;

//  Get server version from the server,
//  ignore text lines which are sent before if any
while (true)
{
    ...
}

... should fix the problem.

Also consider reporting the bug to Amazon.

I have reported the bug to SSH.NET including the needed change.


If you cannot change SSH.NET code, you will need to use another SFTP library.

例如,我的WinSCP .NET程序集与Amazon Managed SFTP服务器兼容。

这等效于您的代码:

// Set up session options
SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Sftp,
    HostName = baseHost,
    UserName = user,
    SshHostKeyFingerprint = ...,
    SshPrivateKeyPath = keyLocation,
    PrivateKeyPassphrase = pkpassword,
};

using (Session session = new Session())
{
    // Connect
    session.Open(sessionOptions);

    // Your code
}

WinSCP GUI可以为您生成类似于上面的代码模板

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

SSH到远程服务器IP时连接超时

JMap.java-尝试连接到调试服务器时超时-SwDbgSrv.exe

使用WinSCP .NET程序集连接到SFTP服务器时,“主机密钥与配置的密钥不匹配”

.NET Core SignalR,服务器超时/重新连接问题

C#SSH到服务器A,SFTP上传到服务器B(使用SSH.NET)

如何使用paramiko为SFTP服务器连接设置超时?

使用SSH.NET连接到SFTP服务器时出现“ SocketException:无法解析主机”

将通过HTTP上传的文件上传到ASP.NET,再上传到C#和SSH.NET中的SFTP服务器

无法连接到Redis服务器。连接超时

可以在启动时使用空闲超时配置ASP.NET Core中的Kestrel服务器

调用RDS无服务器时AWS Lambda超时

使用SSH.NET连接到端口990上的FTP站点时,“服务器响应包含空字符”

SSH服务器连接超时

WinSCP .NET库:在不指定SSH主机密钥指纹的情况下连接到SFTP服务器

我尝试连接到服务器时出现“远程服务器超时”异常

连接到服务器时客户端套接字超时

从服务器读取内容时连接超时

连接到Docker服务器时TFTP超时

当我尝试使用外部IP连接到服务器时Java套接字超时

PostgreSQL:无法连接到服务器:连接超时

增加连接超时连接到服务器

使用C#和.NET 4.5连接到SSL服务器时出错

适用于sftp的AWS传输-增加服务器的sftp会话超时

在检查服务器上的端口时获取连接超时

在AWS上ping服务器时请求超时

SSH 服务器上的连接超时

通过 ssh 密钥连接 SFTP 服务器

我需要在 ASP.NET Core Blazor 服务器中延长会话到期超时/登录到期超时

Sublime Text 3 SFTP 通过 SFTP 连接到远程服务器时立即“连接超时”