首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用双包FTPS宝石在Ruby中建立ftps连接

用双包FTPS宝石在Ruby中建立ftps连接
EN

Stack Overflow用户
提问于 2018-12-20 05:23:47
回答 1查看 1.3K关注 0票数 0

我正在尝试获得一个本地FTP连接工作到一个奇怪的FTP服务器在红宝石。它需要TLS和隐式SSL。我有一个FileZilla客户端的配置和工作。这是我的密码:

代码语言:javascript
复制
require 'double_bag_ftps'

DoubleBagFTPS.open(ftp_host, ftp_user, passwd, nil, DoubleBagFTPS::IMPLICIT, :verify_mode => OpenSSL::SSL::VERIFY_NONE) do |ftp|
    ...
  files = ftp.list(file_path)
  STDOUT.write files
end

当我运行上面的内容时,我会得到以下运行时错误:

代码语言:javascript
复制
  bunches of traceback lines
  <path_to_gems>/double-bag-ftps-0.1.4/lib/double_bag_ftps.rb:160:in `initialize': wrong argument type nil (expected OpenSSL/SSL/CTX) (TypeError)

使用Ruby和传统的net/ftp (与TLS/SSL问题相关的各种错误),我似乎无法从服务器上得到任何东西。DoubleBagFTPS似乎是最有希望的宝石,但我仍然有一个错误。可能是因为我没有正确地调用open函数。唯一的nil是第四个参数,但在DooubleBagFTPS示例中清楚地说明了这一点。

有人能帮忙吗?

更新

根据建议,这是我的新代码

代码语言:javascript
复制
 class MyFTP < Net::FTP
   FTP_PORT = 990

   def connect(host, port = FTP_PORT)
     synchronize do
       @host = host
       @bare_sock = open_socket(host, port)
       begin
         ssl_sock = start_tls_session(Socket.tcp(host, port))
         @sock = BufferedSSLSocket.new(ssl_sock, read_timeout: @read_timeout)
         voidresp
         if @private_data_connection
           voidcmd("PBSZ 0")
           voidcmd("PROT P")
         end
       rescue OpenSSL::SSL::SSLError, Net::OpenTimeout
         @sock.close
         raise
      end
    end
   end
 end

   def ftp_options
     {
       username: 'user',
       password: 'password',
       ssl: true,
       passive: true
     }
   end


MyFTP.open(ftp_host, ftp_options) do |ftp|
  ftp.login
  files = ftp.chdir(file_path)
  files = ftp.list
  STDOUT.write files
end

我仍然收到以下错误:

代码语言:javascript
复制
 ---stack-trace---
 <path_to_gem>/ruby/2.5.0/net/protocol.rb:52:in `connect': SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: unknown protocol (OpenSSL::SSL::SSLError)
EN

回答 1

Stack Overflow用户

发布于 2018-12-24 04:36:45

因此,我让它使用普通的旧Net::FTP,如下所示:

代码语言:javascript
复制
 def ftp_options
   {
      username: '<username>',
      password: '<password>',
      ssl: {
        verify_mode: OpenSSL::SSL::VERIFY_NONE
      }
    }
 end

 Net::FTP.open(ftp_host, ftp_options) do |ftp|
   ftp.login(ftp_options[:username], ftp_options[:password])
   files = ftp.list
   STDOUT.write files
   puts "\n"
 end

有一件事我不明白,那就是为什么我不得不将用户名和密码传递给ftp.login方法,因为它已经在ftp_options中定义了,后者被传递给Net::FTP.open()。据我所知,在ftp_options中一切都是正确的。对于我连接到的特定服务器,需要使用TLS/SSL,这是可行的,因此参数变量将被拾取.为什么不使用用户/密码?

不管怎样,至少对我来说案子已经结了。我可以确认,常规Net::FTP似乎至少与这些需要TLS和隐式SSL的非普通FTP服务器中的一台一起工作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53862835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档