4

我正在尝试连接到 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. 验证部分成功。尝试:密码、公钥、键盘交互
  5. 键盘交互认证
  6. 等待数据包
  7. 数据包到达
  8. 提示: 密码:
  9. 等待数据包
  10. 数据包到达
  11. 验证部分成功。尝试:密码、公钥、键盘交互
  12. 等待数据包
  13. 数据包到达
  14. 提示: 密码:
  15. 循环(9 到 15)

更新

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

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

4

1 回答 1

1

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

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

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

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

关于是否是超时错误的任何想法?

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

是否在黑名单中?

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

为什么没有消息或超时呢?

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

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

更新:

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

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

Try: password, publickey, keyboard-interactive

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

要解决这个问题,您应该查看库中的SSHAuthPromptKBIPrompts类,并使用该类的属性在代码中包含带有密码的提示答案SecureFTPConnection

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

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

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

于 2014-10-01T12:54:29.763 回答