1

私は失敗しているこの基本的なコードを持っています:

  ftpconfighash = open("#{RAILS_ROOT}/config/ftp.yml") {|f| YAML.load(f) }
  config = ftpconfighash[12345]

  ftp = Net::FTP::new(config["host"])
  ftp.login(config["username"], config["password"])

  dir += "/" unless config["dir"].blank? or config["dir"].ends_with?("/")
  remotename = File.basename(filename)
  remotename = dir + remotename unless dir.blank?

  if File.binary?(filename)
    puts "PUTting binary file #{filename} to #{remotename}"
    ftp.putbinaryfile(filename, remotename)
  else
    puts "PUTting ASCII file #{filename} to #{remotename}"
    ftp.puttextfile(filename, remotename)
  end
  ftp.close

サーバーにftpで接続し、ファイルを手動でPUTできることを確認しました。また、irbを使用してコードを1行ずつウォークスルーしました。テストとしてXMLファイルを使用しているので、「ftp.puttextfile」が失敗している行です。エラーは次のとおりです。

Net::FTPPermError: 500 Invalid PORT Command.

理解できない。このファイルを実際に配置できることを確認しましたが、このコードでは実行できません。

ftp.debug_modeをtrueに設定しました。これは、ftp.puttextfileコマンドからの出力です。

put: TYPE A
get: 200 Type set to A.
put: PORT 10,0,1,20,198,170
get: 500 Invalid PORT Command.
Net::FTPPermError: 500 Invalid PORT Command.

from /Users/me/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/net/ftp.rb:243:in `getresp'
from /Users/me/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/net/ftp.rb:251:in `voidresp'
from /Users/me/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/net/ftp.rb:274:in `voidcmd'
from /Users/me/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/monitor.rb:242:in `synchronize'
from /Users/me/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/net/ftp.rb:272:in `voidcmd'
from /Users/me/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/net/ftp.rb:287:in `sendport'
from /Users/me/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/net/ftp.rb:295:in `makeport'
from /Users/me/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/net/ftp.rb:328:in `transfercmd'
from /Users/me/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/net/ftp.rb:424:in `retrlines'
from /Users/me/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/monitor.rb:242:in `synchronize'
from /Users/me/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/net/ftp.rb:422:in `retrlines'
from /Users/me/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/net/ftp.rb:631:in `list'
from (irb):42

RubyがFTPサーバーが理解できないコマンドを実行しようとしているようです。

PORT 10,0,1,20,198,170

そのコマンドを抑制する方法はありますか、それとも何か他のものが欠けていますか?

4

1 に答える 1

6

パッシブFTPを使用してみてください。

ftp = Net::FTP::new(config["host"])
ftp.login(config["username"], config["password"])

ftp.passive = true
于 2012-04-20T16:21:48.127 に答える