こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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はコードを
 かえさないのでしょうか。

ご教示ください。

投稿日時 - 2007-06-18 16:21:21

QNo.3095272

困ってます

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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番台はサーバ側エラーコードです。

投稿日時 - 2007-06-19 13:55:32

補足

ありがとうございます。
結局レスポンスコードをとって対応するようにしたのですが
PUT、GET文の成功時は226番が返ってきます。
226番がGREPできない時はエラーとするように修正したのですが

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

投稿日時 - 2007-06-21 13:14:52

ANo.2

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

lcd コマンドに対するメッセージは、ftpのバイナリファイルに組み込まれたものだと思います。( strings /usr/bin/ftp )

投稿日時 - 2007-06-18 16:43:17

お礼

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

投稿日時 - 2007-06-18 18:02:49

ANo.1

lcdはローカル側のディレクトリ変更です。
ローカルのOS上でディレクトリ変更のシステムコールが実行され、
OSからはLANGで指定されたロケールの言語でエラーメッセージが返されます。
要するに、シェル上で
  cd sss
とやったのとまったく同じことです。
またこれはFTPプロトコルを介しません。

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

投稿日時 - 2007-06-18 16:33:31

補足

皆様ありがとうございます。納得です。

FTPコマンド内にlcdやls がある場合はFTP通信に関係
ないのでローカルの言語に依存する と理解していいでしょうか?

これとは別で、FTP通信によって発生したエラーメッセージ
が日本語だったり、英語だったりするのは、相手側のFTPデーモン
の言語によって変わると理解してよいでしょうか?

また別なのですがエラートラップを文字列のgrepによってやってるのですが(FTP結果に対しgrep -i "Unknown host" 等)
日本語で帰ってきた場合スルーしてしまいます。(全てのエラーにひっかからなくなった場合、正常終了する仕様)
正常以外はなにかのエラーとして最後にトラップをつけたいのですが
日本語でも英語でもうまくいくやり方はないでしょうか。

投稿日時 - 2007-06-18 17:54:35

あなたにオススメの質問