来自Ruby on Rails App的FTPS(TLS/SSL)

Cra*_*all 14 ruby ruby-on-rails

我有一个FTP服务器,它只通过运行FTPS(显式FTP over TLS)接受连接.我需要能够使用Ruby on Rails应用程序连接到此.

有人知道这样做的方法吗?我已经尝试过该Net::FTP库,但这似乎不支持FTPS连接.

Pet*_*osB 9

怎么用Net::FTPTLS

  • 想知道它在ruby 1.9中的位置 (4认同)

Bre*_*een 5

从 Ruby 2.4 开始,FTP 上的 TLS 已经可用Net::FTP......这导致像 double-bag-ftps 这样的宝石被存档,并且你所有的 google 搜索都会产生过时的答案。

如果您可以通过 TLS 进行显式 FTP(正常连接到 FTP,然后发出命令 AUTH TLS 切换到 TLS 模式),那就太好了...应该能够通过以下方式使用 Ruby 的 Net::FTP 开箱即用{ssl: true}在选项中。

然而,基于 TLS 的隐式 FTP(从一开始就通过 TLS 运行)并不是开箱即用的,您必须重写 的Net::FTP连接方法来建立 SSL 套接字,然后可以选择将命令发送到 FTP 服务器。

Inidka K 发布了一个 Github Gist,但由于这些形式很糟糕(可能会过时),所以我发布了适用于 ShareFile 隐式 FTP 设置的版本(似乎只支持隐式 FTP):

require 'net/ftp'

class ImplicitFtp < 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
Run Code Online (Sandbox Code Playgroud)

然后,在您的代码中:

ftp_options = {
  port:    990,
  ssl:      true,
  debug_mode: true, # If you want to see what's going on
  username: FTP_USER,
  password: FTP_PASS
}
ftp = ImplicitFtp.open(FTP_HOST, ftp_options)
puts ftp.list
ftp.close
Run Code Online (Sandbox Code Playgroud)

  • 你的回答很有帮助。谢谢你! (2认同)