【问题标题】:Why can't Net::FTP connect to server?为什么 Net::FTP 无法连接到服务器?
【发布时间】:2013-02-12 18:32:21
【问题描述】:

我正在尝试创建一个脚本来使用 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 `'

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

【问题讨论】:

    标签: ruby net-ftp


    【解决方案1】:

    您的代码对我来说很好用。我怀疑问题可能是因为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. Active模式下,客户端创建一个到服务器的 TCP 控制连接并向服务器发送客户端的 IP 地址和任意客户端端口号,然后等待服务器发起数据连接TCP 到该客户端 IP 地址和客户端端口号。在客户端位于防火墙后面且无法接受传入 TCP 连接的情况下,可以使用被动模式。
    2. Passive模式下,客户端使用控制连接向服务器发送PASV命令,然后从服务器接收服务器IP地址和服务器端口号,然后客户端用来打开一个从任意客户端端口到接收到的服务器 IP 地址和服务器端口号的数据连接。

    【讨论】:

    • 感谢 Ashish,我将 Net:FTP 模式更改为被动模式,并且无需更改 ftp 服务器配置就可以工作.. :)
    • @adhown 如果有帮助,那么您应该接受答案。这样做不仅不会增加您的声誉,而且在确保人们不断回复您的查询方面大有帮助。
    • @Ashish.. 抱歉 Ashish 我是 stackoverflow 的新手,我不明白你的意思.. 我该怎么办?
    • 为什么是活动默认
    • @fjuan 很高兴它对您有所帮助,并感谢您的支持。干杯!
    【解决方案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 和/或防火墙。

    【讨论】:

    • yaaa,我已经通过 irb 测试了我的代码,该代码可以登录,但是当我尝试列出时,出现错误。我认为问题与我的 ftp 服务器配置有关。谢谢您的建议。 :)
    猜你喜欢
    • 1970-01-01
    • 2011-05-28
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2011-10-11
    • 2014-05-04
    相关资源
    最近更新 更多