2013-10-02 58 views
2

我有一個遠程ftp服務器。
我可以通過Cyber​​Duck或終端ftp客戶端連接到它。使用Net :: FTP實例方法「打開」用於具有自定義端口的FTP

當試圖與Net::FTP連接我可以這樣做:

ftp=Net::FTP.new 
ftp.connect('url', 'port') 
ftp.login('username', 'password') 

但是,這樣做:

Net::FTP.open('url', 'username', 'password') 

回報Errno::ECONNREFUSED: Connection refused - connect(2)

看起來好像.open不接受一個端口參數,因爲我使用自定義端口導致一個錯誤。但我需要使用.open方法,因爲它用於我使用的外部寶石(carrierwave-webdav)。
任何解決方法爲這一個或應該創建我自己的叉?
如何使用.open方法連接到我的ftp?

回答

1

看起來Net::FTP::open調用Net::FTP::connect在引擎蓋下,它連接到端口set in the FTP_PORT constant。這不是一個很好的解決方案,但你可以設置這個常數到你需要的端口。

3

如果傳遞 主機參數 Net::FTP.new或強制 Net::FTP.open它會嘗試立即連接,所以你必須通過非標準的端口號在其他的方式就像一個主機名一起傳遞:

網:: FTP.open(「URL:端口」,「用戶名」,「密碼」)

UPDATE: 紅寶石網庫很遺憾,所以你需要完成所有連接步驟不解析主機字符串另:

ftp = Net::FTP.new # don't pass hostname or it will try open on default port 
ftp.connect('url', port) # here you can pass a non-standard port number 
ftp.login('username', 'password') 
ftp.passive = true # optional, if PASV mode is required 
+0

當我包含':'時,我總是會得到'SocketError:getaddrinfo:nodename或者servname,或者不知道'。 –

+0

@IanVaughan答案已更新 –

1

的@ jackbot的答案是正確的,並設置FTP_PORT示例代碼非常簡單:

Net::FTP.send(:remove_const, 'FTP_PORT') # just to avoid warnings 
Net::FTP.const_set('FTP_PORT', 22222) 

,其中22222是新的FTP端口。

完整鏈爲:open調用new,調用connect,它使用FTP_PORT。您可以在這裏查看源代碼:http://docs.ruby-lang.org/en/2.0.0/Net/FTP.html#method-c-new