• 締切済み

FTPのエラーメッセージで質問です。

FTPでエラーメッセージについて質問です。 UNIX上でFTPコマンドを発行するのですが、 open localhost user aaa bbb でログインした後、以下の2つのコマンドを発行します。 sssというディレクトリはありません。 lcd sss cd sss ftp> lcd sss sss: ファイルもディレクトリもありません。 ftp> cd sss 550 sss: No such file or directory. となり、英語と日本語が混在してしまいます。 シェルでは、エラーメッセージの一部をgrepして トラップさせているのですが、日本語もあるためうまくいきません。 そこで、export LANG=ja_JP.UTF-8 だったのを export LANG=C に変えたところ ftp> lcd sss sss: No such file or directory ftp> cd sss 550 sss: No such file or directory. となり英語になりました。 そこで質問です。 (1)LANG=UTF8にしてる時、cd sss は何故lcd sssのエラーと異なり  英語なのでしょうか。 (2)cd sssは550のコードを返すのに何故 lcd sssはコードを  かえさないのでしょうか。 ご教示ください。

みんなの回答

  • marklet
  • ベストアンサー率21% (4/19)
回答No.3

HTTPでも404 File not found と返したり、404 NOT FOUND と返したり、サーバに依りますよね?FTPでも文言は一意ではありません。 判定方法ですが、3桁のコードはRFCで規格化されています( http://jbpe.tripod.com/rfcj/rfc-959.ej.sjis.txt /35ページ以降)ので、このコードを使ってはどうでしょうか? 例えば、cdコマンドが成功した場合には、250 CWD command successful のような数字+メッセージが表示されると思います。 200番台なら肯定的な完了コード、500番台はサーバ側エラーコードです。

-Rena-
質問者

補足

ありがとうございます。 結局レスポンスコードをとって対応するようにしたのですが PUT、GET文の成功時は226番が返ってきます。 226番がGREPできない時はエラーとするように修正したのですが コマンドの中で「LS ファイル名」も発行しており、これも成功すると226番が返ってきます。 PUTは失敗したけど、LSコマンドが成功するとやはり226番がかえるので この時が問題になってしまいます。 226のカウントをとったりする方法しかないでしょうか。 今はそれはレアなケースなので対応しなくてもいいかなと思ってもいます。

  • marklet
  • ベストアンサー率21% (4/19)
回答No.2

550というエラーコードは、FTPクライアントとサーバ間での取り決めです。ローカル側のファイル操作に対しては、サーバと通信しません。 http://jbpe.tripod.com/rfcj/rfc-959.ej.sjis.txt FTPクライアントで cd というコマンドを打つと、CWDコマンドに翻訳されてFTPサーバに通信し、その結果がサーバから返されると思います。 lcd コマンドに対するメッセージは、ftpのバイナリファイルに組み込まれたものだと思います。( strings /usr/bin/ftp )

-Rena-
質問者

お礼

ありがとうございます。 通信するコマンドとそうでないので、異なるということですね。 言語が同じならばエラーメッセージは同じになるけど FTPサーバを返せば、コードが頭についてくる 所が 違うのですね。 納得しました。 また、下記の補足に便乗ですが、質問をしましたので 宜しければご教示下さい。

noname#43437
noname#43437
回答No.1

lcdはローカル側のディレクトリ変更です。 ローカルのOS上でディレクトリ変更のシステムコールが実行され、 OSからはLANGで指定されたロケールの言語でエラーメッセージが返されます。 要するに、シェル上で   cd sss とやったのとまったく同じことです。 またこれはFTPプロトコルを介しません。 cdはサーバ側のディレクトリ変更です。 システムコールはサーバ側のOSで実行され、 そのOS上のロケールでエラーメッセージが返され、それを FTPサーバーがクライアントに伝えてきます。したがって、 サーバ側のロケールのメッセージとなります。 要するに、このメッセージは、サーバ側のシェルで   cd sss とやったときと同じです。クライアント側のLANGの影響は一切受けません。 またこれはFTPプロトコルを介すので、 プロトコル上のエラーコード550がつきます。(これをエラーコードごと表示するかどうかはFTPクライアント次第)

-Rena-
質問者

補足

皆様ありがとうございます。納得です。 FTPコマンド内にlcdやls がある場合はFTP通信に関係 ないのでローカルの言語に依存する と理解していいでしょうか? これとは別で、FTP通信によって発生したエラーメッセージ が日本語だったり、英語だったりするのは、相手側のFTPデーモン の言語によって変わると理解してよいでしょうか? また別なのですがエラートラップを文字列のgrepによってやってるのですが(FTP結果に対しgrep -i "Unknown host" 等) 日本語で帰ってきた場合スルーしてしまいます。(全てのエラーにひっかからなくなった場合、正常終了する仕様) 正常以外はなにかのエラーとして最後にトラップをつけたいのですが 日本語でも英語でもうまくいくやり方はないでしょうか。

関連するQ&A