- 名前
- 説明
- 作者および著作権情報(=Author and Copyright Information)
- libnetの取得とインストール
- Net::FTPの使い方
- FTPサーバからファイルをダウンロードする方法は?
- バイナリ・モードでファイルを転送する方法は?
- リモートのFTPサーバ上にあるファイルの大きさを取得する方法は?
- リモートのFTPサーバ上にあるファイルの更新日時を取得する方法は?
- リモートのFTPサーバ上にあるファイルのパーミッションを取得する方法は?
- ftpコマンドのような再取得(reget)操作はできますか?
- FTPサーバーからディレクトリのリストを取得する方法は?
- ""にディレクトリを変更することは失敗しませんか?
- SOCKSファイアウォールの内側にいます。しかしFirewallオプションが機能しません?
- FTPプロキシー・ファイアウォールの内側にいますが、外側のマシンにアクセスできません
- 私のファイアウォールはポート21をリスンしません
- FTPサーバー上のファイルのパーミッションを変更することはできますか?
- メソッドmessageを呼んでいるスクリプトを見たことがありますが、ドキュメントに見当たりません?
- なぜNet::FTPはmputとmgetメソッドを実装していないのですか?
- Net::SMTPの使い方
- スクリプトのデバッグ方法
- 作者と著作権(AUTHOR AND COPYRIGHT)
名前¶
libnetFAQ - libnetでよく聞かれる質問(Frequently Asked Questions)
説明¶
このドキュメントはどこで手に入りますか¶
このドキュメントはlibnetディストリビューションと一緒に配布されます。 また下記のlibnet Webページからも取得することが出来ます
http://www.pobox.com/~gbarr/libnet/
このドキュメントに貢献する方法は¶
修正、追加そして提案を私にメールすることができます [email protected].
作者および著作権情報(=Author and Copyright Information)¶
Copyright (c) 1997-1998 Graham Barr. All rights reserved. This document is free; you can redistribute it and/or modify it under the terms of the Artistic License.
放棄声明(Disclaimer)¶
この情報は正しいという信念のもとに、そしてこれが便利であるようにという 希望をもって提供されています。しかし正しく、最新で、どのような特定の目的に 対しても適切であるということは保障されません。作者はこの情報あるいは利用に ついて何の責任も負いません。
libnetの取得とインストール¶
libnetって何?¶
libnetperl5モジュールの集合体で、それらは全てネットワークプログラムに 関連します。利用できるモジュールの多くはインターネット・コミュニティで 使われる、ポピュラーなサーバー-クライアントプロトコルでのクライアント側を 提供します。
どのバージョンのperlが必要ですか?¶
libnetはperlのバージョン5.002以降で動くことがわかっています。しかし あなたのperlのバージョンがperl5.004より前であれば、CPANからIO ディストリビューションを取得し、インストールする必要があります。 もしperl5.004やそれ以降をもっていればIOモジュール群は既にインストール されています。しかしCPANには更新されているものがあるかもしれません。
他に必要なモジュールは何ですか?¶
あなたがインストールする必要があるモジュールはIOディストリビューションの モジュールだけです。perl5.004以降を持っているのであれば、それらのモジュールは 既に持っていることになります。
どのマシンがlibnetをサポートしていますか?¶
libnetそれ自身は完全にperlで書かれた(perl-code)ディストリビューションです。 そのためperlが実行できる全てのマシンで動くでしょう。しかしIOはいくつかの マシンそしてperlの前のバージョンでは動かないかもしれません。しかし perlバージョン5.004以降では、そのようなことはないでしょう。
最新のlibnetリリースはどこで手に入りますか?¶
最新のlibnetリリースは常にCPANにあります。それは以下のところで 見つかるでしょう
http://www.cpan.org/modules/by-module/Net/
最新のリリースと情報は常にlibnet webページにもあります
http://www.pobox.com/~gbarr/libnet/
Net::FTPの使い方¶
FTPサーバからファイルをダウンロードする方法は?¶
comp.lang.perl.miscにポストされた記事からの例
#!/your/path/to/perl
# 人生を楽にしてくれるモジュール
use Net::FTP;
# デバッグ用: $ftp = Net::FTP->new('site','Debug',10);
# 接続をオープンし、ログイン!
$ftp = Net::FTP->new('target_site.somewhere.xxx');
$ftp->login('username','password');
# 転送モードをバイナリに設定
$ftp->binary();
# ftp側のディレクトリを変更
$ftp->cwd('/some/path/to/somewhere/');
foreach $name ('file1', 'file2', 'file3') {
# getの引数は以下の順番:
# ftpサーバーのファイル名
# 転送によりローカルマシン上に保存されるファイル名
# 同じ名前にしたければ、単純にget($name)とすることもできます
$ftp->get($name,$name);
}
# ftp 終了!
$ftp->quit;
バイナリ・モードでファイルを転送する方法は?¶
<LF><CR>の変換なしに転送するため、Net::FTPはbinary
メソッドを 提供しています。
$ftp->binary;
リモートのFTPサーバ上にあるファイルの大きさを取得する方法は?¶
リモートのFTPサーバ上にあるファイルの更新日時を取得する方法は?¶
リモートのFTPサーバ上にあるファイルのパーミッションを取得する方法は?¶
FTPプロトコルはリモート・サーバ上のファイルのパーミッションを変更するための コマンドを持っていません。しかしいくつかのftpサーバーはSITEコマンドを 通してchmodコマンドを発行することを許すかもしれません。例えば
$ftp->quot('site chmod 0777',$filename);
しかしこれは動くことが保障されません。
ftpコマンドのような再取得(reget)操作はできますか?¶
FTPサーバーからディレクトリのリストを取得する方法は?¶
""にディレクトリを変更することは失敗しませんか?¶
->cwd()に""という引数を渡すことは、引数なしで->cwd()を呼び出すのと同じ効果を 持ちます。Debug(下記参照)を有効にすれば、何が起きるかがわかるでしょう
$ftp = Net::FTP->new($host, Debug => 1);
$ftp->login;
$ftp->cwd("");
以下のようになります
Net::FTP=GLOB(0x82196d8)>>> CWD /
Net::FTP=GLOB(0x82196d8)<<< 250 CWD command successful.
SOCKSファイアウォールの内側にいます。しかしFirewallオプションが機能しません?¶
Firewallオプションは1種類のファイアウォールをサポートしています。その サポートされている種類はftp proxyです。
Net::FTPやlibnetディストリビューションに入っているその他のモジュールを SOCKSファイアウォールを通して利用するためには、 socksライブラリと一緒にperlをコンパイルすることにより socks対応された(socks-ified) perl 実行形式を作成しなければなりません。
FTPプロキシー・ファイアウォールの内側にいますが、外側のマシンにアクセスできません¶
Net::FTPはほとんどのポピュラーなftpプロキシー・ファイアウォール・アプローチを 実装してます。実装されている概要は、あなたがファイアウォールにuser@hostname
で ログインすることです。
あるアカウントでファイアウォールにログインし、次にuser@hostname
でログインする ことを要求する他の種類のファイアウォールがあることを聞いたことがあります。 それでもNet::FTPを使って、これらのファイアウォールを通ることが出来ます。 しかしより手作業のアプローチを取らなければなりません。eg
$ftp = Net::FTP->new($firewall) or die $@;
$ftp->login($firewall_user, $firewall_passwd) or die $ftp->message;
$ftp->login($ext_user . '@' . $ext_host, $ext_passwd) or die $ftp->message.
私のファイアウォールはポート21をリスンしません¶
他のどのFTPサーバーと同じようにFTPサーバーは通常、同じポート番号、 ポート21をリスンします。しかしそうしなければいけない理由はありません。
Net::FTPにポート番号を渡すと、それが最終的な出力先のポート番号だと 想定します。デフォルトではNet::FTPは常にポート21でファイアウォールに 接続しようとします。
Net::FTPは接続をオープンするためにIO::Socketを利用します。そしてIO::Socketは ポート番号をホスト名の一部として指定されることを許しています。このための この問題は"hostname:1234"
のようにFirewallオプションを渡すか、 同じ形式でNet::Configでのftp_firewall
を設定するかのどちらかによって解決する ことができます。
FTPサーバー上のファイルのパーミッションを変更することはできますか?¶
この答えは"多分"です。FTPプロトコルはリモートホスト上のファイル・パーミッションを 変更するためのコマンドを指定していません。しかし多くのサーバーはSITE
コマンドを 通してchmodコマンドを実行することを許しています。これは以下のようになります
$ftp->site('chmod','0775',$file);
メソッドmessageを呼んでいるスクリプトを見たことがありますが、ドキュメントに見当たりません?¶
libnetに入っているほかのパッケージと同じようにNet::FTPはNet::Cmdを継承しています。 そのためNet::Cmdで記述されている全てのメソッドもNet::FTPオブジェクトで利用する ことができます。
なぜNet::FTPはmputとmgetメソッドを実装していないのですか?¶
簡単な答えは、あなた自身で実装するのが簡単だからです。長い答えは これらを複数のプラットホームが正しくサポートされるように書くことは あまりにも多くのコードが必要となるからです。いかにあなた自身が それらをどのように実装できるかの例をいくつか示します。
sub mput { my($ftp,$pattern) = @_; foreach my $file (glob($pattern)) { $ftp->put($file) or warn $ftp->message; } }
sub mget { my($ftp,$pattern) = @_; foreach my $file ($ftp->ls($pattern)) { $ftp->get($file) or warn $ftp->message; } }
Net::SMTPの使い方¶
@から後ろのEmailアドレスの部分をホスト名として使えないのはなぜですか?¶
Emailアドレスでの@からの後ろ部分は必ずしもホスト名ではありません。 それはメールドメインです。メールドメインに接続するためのホストの名前を 見つけるためは、DNS MX lookupをする必要があります。
Net::SMTPがDNS MX lookupをしないのはなぜですか?¶
Net::SMTPはSMTPプロトコルを実装します。DNS MX lookupはその プロトコルの一部ではありません。
verifyが常にtrueを返すのはなぜですか?¶
それはそんな風に見えてしまうかもしれませんが、そうではありません。 そのコマンドが成功すると、verifyメソッドはtrueを返します。 サーバーが通常、他のマシンに転送しなければならないアドレスをverifyに 渡すと、コマンドは以下のように成功します
252 Couldn't verify <someone@there> but will attempt delivery anyway
(<someone@there>を確認することはできませんが、いずれにせよ配送しようとします)
このコマンドは、そのサーバーが直接配送するドメインにあるアドレスを渡し、 それが存在しない場合にのみ失敗します。
スクリプトのデバッグ方法¶
Net::*モジュールを使うスクリプトをデバッグするにはどうすればいいですか?¶
libnetクライアントクラスのほとんどは、コンストラクタにオプションを渡すことが できます。ほとんどの場合、あるオプションはDebug
と呼ばれます。 このオプションを0以外の値を渡すと、プロトコルのトレースを有効とし、 それらはSTDERRに送られます。このトレースはリモート・サーバーに送られる コマンド、返され受け取られる応答が何かを見るのに便利です。
#!/your/path/to/perl
use Net::FTP;
my $ftp = new Net::FTP($host, Debug => 1);
$ftp->login('gbarr','password');
$ftp->quit;
このスクリプトは以下のように出力するでしょう
Net::FTP: Net::FTP(2.22)
Net::FTP: Exporter
Net::FTP: Net::Cmd(2.0801)
Net::FTP: IO::Socket::INET
Net::FTP: IO::Socket(1.1603)
Net::FTP: IO::Handle(1.1504)
Net::FTP=GLOB(0x8152974)<<< 220 imagine FTP server (Version wu-2.4(5) Tue Jul 29 11:17:18 CDT 1997) ready.
Net::FTP=GLOB(0x8152974)>>> user gbarr
Net::FTP=GLOB(0x8152974)<<< 331 Password required for gbarr.
Net::FTP=GLOB(0x8152974)>>> PASS ....
Net::FTP=GLOB(0x8152974)<<< 230 User gbarr logged in. Access restrictions apply.
Net::FTP=GLOB(0x8152974)>>> QUIT
Net::FTP=GLOB(0x8152974)<<< 221 Goodbye.
最初の数行はNet::FTPが利用するモジュールとそのバージョンを伝えます。 これはユーザーがバグを報告するとき、私にとって有効なデータです。最後の7行は サーバとの通信を表しています。各行には3つの部分があります。最初の部分は オブジェクトそのものです。これはもし複数のオブジェクトを使っているならば、 出力を切り分けるために有効です。2番目の部分はサーバからのデータを示す<<<<
あるいはサーバーにいくデータを示す>>>>
のどちらかになります。 行の残りは送信されるコマンドもしくは受け取られた応答になります。
作者と著作権(AUTHOR AND COPYRIGHT)¶
Copyright (c) 1997 Graham Barr. All rights reserved.
$Id$