2013-02-27 95 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