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?
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With