13

我正在尝试创建一个脚本来使用 Ruby 从 FTP 服务器列出和下载数据。我是 Ruby 新手,所以我查找了如何使用 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 >建立连接失败。(网络::FTPTempError)
    来自 /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/ftp.rb:325:in `block in sendcmd'
    来自 /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
    来自 /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/ftp.rb:323:in `sendcmd'
    来自 /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/ftp.rb:402:in `transfercmd'
    来自 /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/ftp.rb:478:in `retrlines 中的块(2 级)'
    来自 /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/ftp.rb:178:in `with_binary'
    来自 /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/ftp.rb:477:in `block in retrlines'
    来自 /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
    来自 /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/ftp.rb:476:in `retrlines'
    来自 /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/ftp.rb:722:in `list'
    来自 test_ftp.rb:10:in `block in '
    来自 /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/ftp.rb:116:in `open'
    来自 test_ftp.rb:8:in `'

谁能解释我的脚本有什么问题?

4

2 回答 2

40

你的代码对我来说很好。我怀疑问题可能是由于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

如果您好奇,以下是主动模式和被动模式之间的区别(来自维基百科)。

  1. 主动模式下,客户端创建一个到服务器的 TCP 控制连接并向服务器发送客户端的 IP 地址和任意客户端端口号,然后等待服务器通过 TCP 向该客户端 IP 地址和客户端端口号发起数据连接. 在客户端位于防火墙后面并且无法接受传入 TCP 连接的情况下,可以使用被动模式。
  2. 被动模式下,客户端使用控制连接向服务器发送 PASV 命令,然后从服务器接收服务器 IP 地址和服务器端口号,然后客户端使用这些 IP 地址和服务器端口号打开从任意客户端端口到服务器的数据连接收到的 IP 地址和服务器端口号。
于 2013-02-27T04:50:08.860 回答
2

以下脚本可在我的机器上运行,并且基于您的机器,并进行了少量清理:

require 'net/ftp'

Net::FTP.open('ftp.linuxjournal.com', 'anonymous', 'anonymous@google.com') 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 和/或防火墙。

于 2013-02-27T04:43:47.810 回答