ruby FTP被动模式错误

时间:2013-03-27 07:28:51

标签: ruby ftp

我尝试过使用被动模式的FTP:

require 'net/ftp'
ftp =  Net::FTP.new
ftp.passive = true
ftp.connect('mydomain.com')
ftp.login
filenames = ftp.nlst

但是有错误:

Errno::ETIMEDOUT: Connection timed out - connect(2)

虽然有效模式但效果很好

我使用ruby 1.9.3。当我设置debuge模式时:

ftp.debug_mode = true

我明白了:

 **ftp.connect('mydomain.com')**
connect: mydomain.com, 21
get: 220---------- Welcome to Pure-FTPd [privsep] ----------
get: 220-You are user number 3 of 50 allowed.
get: 220-Local time is now 11:43. Server port: 21.
get: 220-IPv6 connections are also welcome on this server.
get: 220 You will be disconnected after 15 minutes of inactivity.
=> nil
irb(main):103:0> ftp.login
put: USER anonymous
get: 230 Anonymous user logged in
put: TYPE I
get: 200 TYPE is now 8-bit binary
=> true
irb(main):104:0> filenames = ftp.nlst
put: TYPE A
get: 200 TYPE is now ASCII
put: PASV
get: 227 Entering Passive Mode (1,27,13,19,17,15)
put: TYPE I
get: 200 TYPE is now 8-bit binary
Errno::ETIMEDOUT: Connection timed out - connect(2)

我也发现,使用来自transfercmd主机的函数Net::FTP,与我的域名ip地址不同!也许这是一个私人IP地址?这有什么不对?

1 个答案:

答案 0 :(得分:5)

我已从Net::FTP覆盖了makepasv方法,但它确实有效!

module Net
  class FTP
    def makepasv # :nodoc:
      if @sock.peeraddr[0] == "AF_INET"
        #host, port = parse227(sendcmd("PASV")) #WAS!
        host, port = parse229(sendcmd("EPSV"))
      else
        host, port = parse229(sendcmd("EPSV"))
      end
      return host, port
    end
  end
end