ruby FTP passive mode error
ftp, ruby
Solution
I have overwritten method `makepasv` from `Net::FTP` and it works!
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
Problem
I have tried to use FTP with passive mode: ``` require 'net/ftp' ftp = Net::FTP.new ftp.passive = true ftp.connect('mydomain.com') ftp.login filenames = ftp.nlst ``` But have got error: ``` Errno::ETIMEDOUT: Connection timed out - connect(2) ``` Though with active mode it works fine! I use ruby 1.9.3. When I set debuge mode: ``` ftp.debug_mode = true ``` I see: ``` **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) ``` Also I have found out, that in function `transfercmd` from `Net::FTP` host is used, different from my domain ip address! Maybe it is a private ip address? What is wrong here?