Net::FTP がデフォルト PASV になってなくて困った
新規に Perl をインストールしたとこで cpan 等を使おうとしたら Net::FTP がファイルをとってこれなくなってました。
Debug => 1 にして調べてみたら,
Net::FTP>>> Net::FTP(2.77) Net::FTP>>> Exporter(5.58) Net::FTP>>> Net::Cmd(2.27) Net::FTP>>> IO::Socket::INET(1.31) Net::FTP>>> IO::Socket(1.30) Net::FTP>>> IO::Handle(1.27) Net::FTP=GLOB(0x42b3030)<<< 220 ftp.***** FTP server (Version wu-2.6.2(4) Tue Jan 10 16:55:27 JST 2006) ready. Net::FTP=GLOB(0x42b3030)>>> USER ftp Net::FTP=GLOB(0x42b3030)<<< 331 Guest login ok, send your complete e-mail address as password. Net::FTP=GLOB(0x42b3030)>>> PASS .... Net::FTP=GLOB(0x42b3030)<<< 230-The response 'ftp@' is not valid ...... Net::FTP=GLOB(0x42b3030)<<< 230 User ftp logged in. Access restrictions apply. Net::FTP=GLOB(0x42b3030)>>> CWD /pub/lang/CPAN/authors Net::FTP=GLOB(0x42b3030)<<< 250 CWD command successful. Net::FTP=GLOB(0x42b3030)>>> PORT 192,168,0,132,136,3 Net::FTP=GLOB(0x42b3030)<<< 200 PORT command successful. Net::FTP=GLOB(0x42b3030)>>> RETR 01mailrc.txt.gz Net::FTP=GLOB(0x42b3030)<<< 425 Can't build data connection: Connection refused.
ちょ,プライベートアドレスで PORT とかやっちゃってるよ。デフォルトが PASV じゃない。
いろいろ調べて,libnet の設定は Net::libnet.cfg に存在することを発見しました。
% perldoc -m Net::libnet.cfg { 'pop3_hosts' => , 'ph_hosts' => , 'inet_domain' => undef, 'time_hosts' => , 'daytime_hosts' => , 'smtp_hosts' => , 'test_exist' => 1, 'test_hosts' => 1, 'nntp_hosts' => , 'ftp_testhost' => undef, 'snpp_hosts' => [], 'ftp_int_passive' => 0, }
.libnetrc という rc を書いても挙動を変えられるようですが(see Net::Config),どうせ環境が変わりそうにないので上記ファイルを直接書き換えて対処しました。
% sudo vi `perldoc -ml Net::libnet.cfg` ...
太字のとこを 1 に変えて無事デフォルト PASV になりました。