2013-02-27 111 views
10

我正在嘗試創建一個腳本來列出並使用Ruby從FTP服務器下載數據。我是Ruby新手,所以我查找了如何使用Net :: FTP的文檔。我很難理解爲什麼這不起作用:爲什麼Net :: FTP無法連接到服務器?

require 'net/ftp' 

server = "ftp.server.com" 
user = "myuser" 
password = "mypassword" 


Net::FTP.open(server, user, password) do |ftp| 
     files = ftp.chdir('mydirectory/') 
     files = ftp.list 
     puts "list out of directory:" 
     puts files 
end 

那也不行,返回此錯誤:

 
/home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/ftp.rb:298:in `getresp': 425 >Failed to establish connection. (Net::FTPTempError) 
    from /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/ftp.rb:325:in `block in sendcmd' 
    from /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize' 
    from /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/ftp.rb:323:in `sendcmd' 
    from /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/ftp.rb:402:in `transfercmd' 
    from /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/ftp.rb:478:in `block (2 levels) in retrlines' 
    from /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/ftp.rb:178:in `with_binary' 
    from /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/ftp.rb:477:in `block in retrlines' 
    from /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize' 
    from /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/ftp.rb:476:in `retrlines' 
    from /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/ftp.rb:722:in `list' 
    from test_ftp.rb:10:in `block in ' 
    from /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/ftp.rb:116:in `open' 
    from test_ftp.rb:8:in `' 

誰能解釋一下有什麼不對我的腳本?

回答

37

你的代碼適合我。我懷疑問題可能是因爲Net::FTP連接模式,這是默認激活。嘗試使用被動模式連接,下面的代碼示例 -

ftp = Net::FTP.new(server) 
ftp.passive = true 
ftp.login user, password 
files = ftp.chdir('mydirectory/') 
files = ftp.list 
puts "list out of directory:" 
puts files 
ftp.close 

如果你很好奇,下面是difference(維基百科)主動和被動模式之間。

  1. 主動模式中,客戶端創建TCP控制連接到服務器,並且向服務器發送客戶端的IP地址和任意客戶端的端口號,然後等待,直到服務器發起通過TCP數據連接該客戶端IP地址和客戶端端口號。在客戶端位於防火牆之後並且無法接受傳入TCP連接的情況下,可以使用被動模式。
  2. 被動模式中,客戶端使用控制連接來發送PASV命令到服務器,然後從該客戶端隨後使用來打開從任意的數據連接服務器接收到的服務器的IP地址和服務器端口號客戶端端口接收到服務器的IP地址和服務器端口號。
+0

謝謝阿西什,我改變網:FTP模式爲被動,它的工作沒有我改變FTP服務器配置.. :) – adhown 2013-02-27 05:31:27

+0

@adhown如果它幫助,那麼你應該接受答案。這樣做不僅不會增加您的聲譽,而且會確保人們持續響應您的查詢。 – saihgala 2013-02-28 09:32:28

+0

@Ashish ..對不起Ashish我是新來的stackoverflow,我不明白你是什麼意思..我該怎麼辦? – adhown 2013-02-28 14:13:58

2

下面的腳本從我的機器的工作原理,並根據你的,與未成年人清理:

require 'net/ftp' 

Net::FTP.open('ftp.linuxjournal.com', 'anonymous', '[email protected]') do |ftp| 
    ftp.chdir('pub/') 
    files = ftp.list 
    puts "list out of directory:" 
    puts files 
end 

這是輸出我得到:

list out of directory: 
lrwxrwxrwx 1 root  ftp   32 Jul 12 2010 00-README-TO-UPLOAD-FILES.txt -> ../00-README-TO-UPLOAD-FILES.txt 
drwxr-sr-x 3 root  ftp   21 Mar 7 2001 elj 
drwxr-sr-x 3 root  ftp   4096 Jan 6 2004 lg 
drwxr-sr-x 8 root  ftp   113 Jun 21 2010 lj 
drwxr-sr-x 5 root  users   112 Oct 2 2007 ssc 
drwxr-sr-x 2 root  ftp   4096 Jan 3 17:21 tux 

我想說的代碼作品,而問題在別處。因爲425 >Failed to establish connection我認爲你應該檢查你的DNS和/或防火牆。

+0

yaaa,我已經通過irb測試了我的代碼,那是代碼可以登錄,但是當我嘗試列出時,錯誤出現了。我認爲這個問題與我的ftp服務器配置有關。感謝您的建議。 :) – adhown 2013-02-27 05:27:41