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)
    from /home/adhown/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/ftp.rb:325: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 `ブロック (2 レベル) 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 `'

私のスクリプトの何が問題なのか誰か説明できますか?

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 アドレスと任意のクライアント ポート番号をサーバーに送信し、サーバーがそのクライアント IP アドレスとクライアント ポート番号への TCP 経由のデータ接続を開始するまで待機します。 . クライアントがファイアウォールの背後にあり、着信 TCP 接続を受け入れることができない状況では、パッシブ モードを使用できます。
  2. パッシブモードでは、クライアントは制御接続を使用して PASV コマンドをサーバーに送信し、サーバーからサーバー 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 に答える