Почему Net :: FTP не подключается к серверу?

Я пытаюсь создать сценарий для отображения и загрузки данных с FTP-сервера с помощью Ruby. Я новичок в 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 >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 ''

Может кто-нибудь объяснить, что случилось с моим скриптом?

Ответ 1

Ваш код отлично работает для меня. Я подозреваю, что проблема может быть связана с режимом Net::FTP connection, который по умолчанию активен. Попробуйте подключиться с использованием пассивного режима, следуя образцу кода -

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

И если вам интересно, следуете различие (от wikipedia) между активным и пассивным режимами.

  1. В активном режиме клиент создает соединение TCP с сервером и отправляет серверу IP-адрес клиента и произвольный номер порта клиента, а затем ждет, пока сервер не инициирует подключение к данным через TCP к этому IP-адресу и номер порта клиента, В ситуациях, когда клиент находится за брандмауэром и не может принимать входящие TCP-соединения, может использоваться пассивный режим.
  2. В пассивном режиме клиент использует контрольное соединение для отправки команды PASV на сервер, а затем получает IP-адрес сервера и номер порта сервера с сервера, который затем использует клиент, чтобы открыть соединение данных с произвольного клиентского порта на сервер IP-адрес и номер порта сервера.

Ответ 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 и/или брандмауэры.