2013-03-27 20 views
5

Próbowałem użyć protokołu FTP w trybie pasywnym:
Ruby FTP tryb pasywny błąd

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

Ale mam błąd:

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

Choć z aktywnego trybu działa dobrze!

Używam ruby ​​1.9.3. Kiedy ustawić debuge Tryb:

ftp.debug_mode = true 

widzę:

**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) 

Również odkryli, że w zależności od Net::FTPtransfercmd hosta jest używana, różni się od mojego adresu IP domeny! Może to prywatny adres IP? Co jest nie tak?

+0

Czy jesteś pewien, że twój serwer pozwala na tryb pasywny? Wygląda na to, że porty są zamknięte. –

+0

Czy sprawdziłeś, czy twój serwer zapewnia możliwość podłączenia trybu pasywnego? – xyz

+0

Tak, mój serwer zapewnia możliwość podłączenia trybu pasywnego. Sprawdziłem przy użyciu klienta FTP. – Vasilina

Odpowiedz

4

Mam nadpisaną metodę makepasv od Net::FTP i to działa!

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 
+1

Dobra robota, to się udało, jest tam łatka! –