gpt4 book ai didi

c# - 尝试连接到 sftp 服务器时没有消息或超时

转载 作者:行者123 更新时间:2023-11-30 12:44:59 27 4
gpt4 key购买 nike

我正在尝试连接到 sftp 服务器,但没有遇到任何异常或超时,只是增加了内存使用量。

我正在使用库 EnterpriseDT.Net.Ftp

我的代码是这样的:

XmlConfigurator.Configure();
Module1.Logger = LogManager.GetLogger("SftpTester");
try
{
Module1.Logger.Info((object) "[EnterpriseDT] - Start");
Uri uri1 = new Uri("ftp://*****");
// ISSUE: explicit reference operation
// ISSUE: variable of a reference type
Uri& uri2 = @uri1;
int port = ****;
string str1 = "******";
// ISSUE: explicit reference operation
// ISSUE: variable of a reference type
string& UserName = @str1;
string str2 = "*******";
// ISSUE: explicit reference operation
// ISSUE: variable of a reference type
string& Password = @str2;
SecureFTPConnection secureFtpConnection = Module1.InitConnection(uri2, port, UserName, Password);
Module1.Logger.Info((object) "Connecting to ftp...");
secureFtpConnection.Connect();
Module1.Logger.Info((object) "Connection Successful!!!");
try
{
Module1.Logger.Info((object) "Disposing connection...");
secureFtpConnection.Dispose();
}
catch (Exception ex)
{
ProjectData.SetProjectError(ex);
ProjectData.ClearProjectError();
}
Module1.Logger.Info((object) "Connection Disposed.");
}
catch (Exception ex)
{
ProjectData.SetProjectError(ex);
Exception exception = ex;
Module1.Logger.Error((object) ("Main() - " + exception.Message));
Module1.Logger.Error((object) ("StackTrace: " + exception.StackTrace));
if (exception.InnerException != null)
Module1.Logger.Error((object) ("InnerException: " + exception.InnerException.Message));
ProjectData.ClearProjectError();
}
finally
{
Module1.Logger.Info((object) "[EnterpriseDT] - End");
}

private static SecureFTPConnection InitConnection(ref Uri uri, int port, ref string UserName = "", ref string Password = "")
{
Module1.Logger.Info((object) "InitConnection() - Setting Up Connection");
SecureFTPConnection secureFtpConnection = new SecureFTPConnection();
secureFtpConnection.LicenseOwner = "*******";
secureFtpConnection.LicenseKey = "***********";
secureFtpConnection.ServerAddress = uri.Host;
Module1.Logger.Info((object) ("\tHost: " + uri.Host));
secureFtpConnection.UserName = UserName;
Module1.Logger.Info((object) ("\tUsername: " + UserName));
secureFtpConnection.Protocol = FileTransferProtocol.SFTP;
Module1.Logger.Info((object) ("\tProtocol: " + FileTransferProtocol.SFTP.ToString()));
secureFtpConnection.ServerValidation = SecureFTPServerValidationType.None;
Module1.Logger.Info((object) ("\tServerValidation: " + SecureFTPServerValidationType.None.ToString()));
secureFtpConnection.AuthenticationMethod = AuthenticationType.Password;
Module1.Logger.Info((object) ("\tAuthenticationMethod: " + AuthenticationType.Password.ToString()));
if (port > 0)
{
secureFtpConnection.ServerPort = port;
Module1.Logger.Info((object) ("\tServerPort: " + port.ToString()));
}
secureFtpConnection.Password = Password;
Module1.Logger.Info((object) ("\tPassword: " + Password));
return secureFtpConnection;
}

日志消息:

2014-09-27 04:50:22,783 [1] - [SftpTester] [EnterpriseDT] - Start
2014-09-27 04:50:22,799 [1] - [SftpTester] InitConnection() - Setting Up Connection
2014-09-27 04:50:22,971 [1] - [SftpTester] Host: *******
2014-09-27 04:50:22,971 [1] - [SftpTester] Username: *****
2014-09-27 04:50:22,971 [1] - [SftpTester] Protocol: SFTP
2014-09-27 04:50:22,971 [1] - [SftpTester] ServerValidation: None
2014-09-27 04:50:22,971 [1] - [SftpTester] AuthenticationMethod: Password
2014-09-27 04:50:22,971 [1] - [SftpTester] ServerPort: ****
2014-09-27 04:50:22,971 [1] - [SftpTester] Password: ******
2014-09-27 04:50:22,971 [1] - [SftpTester] Connecting to ftp...

不知道这是超时错误还是我在黑名单中?

2014 年 7 月 10 日更新

服务器顺序:

  1. 密码验证
  2. 等待数据包
  3. 数据包到达
  4. Auth 部分成功。尝试:密码、公钥、键盘交互
  5. 键盘交互认证
  6. 等待数据包
  7. 数据包到达
  8. 提示:密码:
  9. 等待数据包
  10. 数据包到达
  11. Auth 部分成功。尝试:密码、公钥、键盘交互
  12. 等待数据包
  13. 数据包到达
  14. 提示:密码:
  15. 循环(9 到 15)

更新

更新库解决了问题,是一个错误。

版本 8.6.1(2014 年 9 月 23 日)
修复了导致身份验证尝试循环的 kbi 重入错误。修复了将文件上传到不存在的目录时未抛出异常的 SFTP 错误。修复了 OpenVMS SFTP 服务器未被识别为 SSH 的 SFTP 问题。修复了仅进行一次重新连接的重试下载问题。修复了某些使用 FTPS 的 2012 R2 计算机上的“尝试读取或写入 protected 内存”问题。

最佳答案

您的代码看起来没问题。没有什么特别的。您应该做的第一件事是在库中启用调试日志记录,因为您没有足够的关于 FTP 代码执行的信息。

您可以使用以下语句启用调试:

EnterpriseDT.Util.Debug.Logger.CurrentLevel = EnterpriseDT.Util.Debug.Level.DEBUG;

默认情况下,它会在控制台中打印调试信息。如果愿意,您可以使用自定义附加程序(文件、数据库等)。调试信息将为您提供有关该问题的更多信息。

Any idea about if is a timeout error?

我不这么认为。默认情况下,库中将客户端超时设置为 120000ms。服务器超时可能要高得多。我认为这不是超时问题。

Am in a blacklist?

也许吧,但同样不应该挂起 FTP 客户端。

Why there is No message or timeout then?

挂起可能是由不正确的 FTP 服务器或防火墙配置引起的。 EnterpriseDT.Net.Ftp 像大多数 FTP 客户端一样默认使用 FTP 被动模式。我建议检查您的 FTP 服务器和防火墙配置,并检查是否为被动模式正确配置了所有内容。

如果您的 FTP 服务器配置正确,您应该能够从任何 FTP 客户端连接到它。您可以尝试 FileZilla 或任何其他客户端,只是为了确保您的服务器设置正确。这样您就可以排除任何防火墙或 FTP 服务器问题。

更新:

从我们目前在日志中看到的情况来看,这是一个身份验证问题。看起来 SSH 服务器支持密码、公钥和键盘交互身份验证。

我对您上面的日志的解释是,您的 SFTP 客户端正在尝试按照以下确切顺序使用以下方法进行身份验证:

Try: password, publickey, keyboard-interactive

密码身份验证(代码中的默认设置)未通过(密码错误?),然后客户端切换到键盘身份验证,这就是为什么您在 SSH 中收到密码提示,而 SFTP 库无法处理这种情况,因为您不包括及时响应。

要解决这个问题,您应该查看库中的 SSHAuthPrompt 类,并使用 上的 KBIPrompts 属性将提示答案和密码包含在您的代码中>SecureFTPConnection 类:

http://www.enterprisedt.com/products/edtftpnetpro/doc/manual/api/html/T_EnterpriseDT_Net_Ftp_Ssh_SSHAuthPrompt.htm

这个类在构造函数中有两个参数。提示应该与您从 KBI 获得的内容相匹配,并且应该是 'Password:',响应值应该是密码。

您还应该尝试将 AuthenticationMode 配置为 KeyboardInteractive。

关于c# - 尝试连接到 sftp 服务器时没有消息或超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26096405/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com