出産前後の痔にはご注意!

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

ご教示ください。

このQ&Aに関連する最新のQ&A

A 回答 (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番台はサーバ側エラーコードです。

この回答への補足

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

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

補足日時:2007/06/21 13:14
    • good
    • 0

550というエラーコードは、FTPクライアントとサーバ間での取り決めです。

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

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

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

お礼日時:2007/06/18 18:02

lcdはローカル側のディレクトリ変更です。


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

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

この回答への補足

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

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

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

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

補足日時:2007/06/18 17:54
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QFTPエラー425

FTPで425エラーが出て困っています。
今まで繋がっていたのが突然繋がらなくなりました。
調べてみると20番ポートが遮断されている可能性が高く、
どこで遮断されているか調べる良い方法があれば教えて下さい。

・クライアント
OS:Windows 8.1、ファイアウォール: Norton Inernet Security
・サーバー(AWS)
OS:Red Hat Enterprise Linux Server release 7.1 (Maipo)
ファイアウォール:AWSのネットワークルール設定

接続は出来ていて、lsを打つとエラーになります。
サーバーにTertermでログインしてlocalhostにftpするとlsできるので、
ftpd自体に問題はなさそうです。
また、サーバー側の設定は直しておらず、突如動かなくなったので、
クライアントのファイアウォール設定が変わったのを疑っていますが、
ファイアウォールを一時停止しても解消しませんでした。
どこが悪いか原因を切り分けられるずに困っています。
原因箇所を調べる良い方法があればご教示ください。

FTPで425エラーが出て困っています。
今まで繋がっていたのが突然繋がらなくなりました。
調べてみると20番ポートが遮断されている可能性が高く、
どこで遮断されているか調べる良い方法があれば教えて下さい。

・クライアント
OS:Windows 8.1、ファイアウォール: Norton Inernet Security
・サーバー(AWS)
OS:Red Hat Enterprise Linux Server release 7.1 (Maipo)
ファイアウォール:AWSのネットワークルール設定

接続は出来ていて、lsを打つとエラーになります。
サーバーにTerterm...続きを読む

Aベストアンサー

>FFFTPで繋いでいて拡張オプションのPASVモードにチェックをつけていないのでpassiveモードではないはずですが、

クライアントソフトはActive FTPで接続しようとしているのは間違いないですね。

>WireSharkで見たところ、後ろにPASVと書かれていました。
>Wireshark結果
>3967 345.551600000 52.27.XX.XXX 192.168.0.4 FTP 105 Response: 200 PORT command> successful. Consider using PASV. ← パッシブモードになっている?

良く読んで下さい。単に「Passiveモードでの使用を検討して下さい」というメッセージです。

クライアントソフトはActive FTPで接続しようとしているものの、サーバ側がActive FTPを恐らくサポートしていないので、「Passiveモードに移行してよ」とメッセージを出した。にも関わらずクライアントはPASVコマンドを実行することもなく、LISTコマンドを実行したので「425 Failed to establish connection」、つまり「だぁかぁらぁ、データセション張ってないんだから」と返したわけです。

「Passiveモードでの使用を検討して下さい」というメッセージは柔らかな表現ですが「いいか、俺はPassiveモードしか受け付けないからな。次はPASVコマンドを打てよな。それ以外は知らんからな」と等価です。まぁ、QUITやBINARYやASCII等は受け付けてくれるとは思いますが。

>またサーバーが20番ポートにセッションを張ろうとしている形跡がありませんでした。
>これはPASVモードになっているのでしょうか?

サーバは少なくともPassiveモードしかサポートしていないようです。なので、サーバからクライアントの20/TCPにはコネクションを張らずに、21/TCPでクライアントからのPASVコマンド待ちです。PASVコマンドがクライアントから来れば、21/TCPでEntering Passive Mode (X,X,X,X,A,B)を返しますので、クライアントはサーバの(A*256+B)/TCPポートに対してSYNを送信、所謂3ウェイハンドシェイクでデータセションが繋がるという流れになります。

>FFFTPで繋いでいて拡張オプションのPASVモードにチェックをつけていないのでpassiveモードではないはずですが、

クライアントソフトはActive FTPで接続しようとしているのは間違いないですね。

>WireSharkで見たところ、後ろにPASVと書かれていました。
>Wireshark結果
>3967 345.551600000 52.27.XX.XXX 192.168.0.4 FTP 105 Response: 200 PORT command> successful. Consider using PASV. ← パッシブモードになっている?

良く読んで下さい。単に「Passiveモードでの使用を検討して下さい」というメッ...続きを読む

QシェルスクリプトでFTPの実行結果を取得するには

OS redhat linux
シェル bornシェル

でftpを実行するスクリプトを作っていますが、
ftpの実行結果は取得できるのでしょうか?

ftp -n < ftpCom.txt

宜しくお願いします。

Aベストアンサー

No.1です。補足拝見しました。

直接ftpコマンドの戻り値では実行結果が判断できないので、私が以前に携わっていたプロジェクトでは、FTPサーバが出すエラーコードをgrepでハンドリングしていました。

FTPはコマンドの結果を「行頭に3桁の数字」で出力する仕様になっており、putもgetも送受信が成功した場合は226が出力されるので、

ftp -nv < ftpCom.txt > ftpLog.txt 2>&1

を例えにとると、このコマンドを実行した後に、
grep ^226 ftpLog.txt > /dev/null
if $? ne 0
then
echo "FTPでエラーが発生しました" >> logfile
exit 1
fi

みたいなことをしていました。grep の引数 ^226 は行頭が226から始まる行を検索、という意味で、grepでマッチする行があった場合は0が戻り値となり、マッチしなければ0以外が戻り値となるので、それを利用していました。

実際の運用では、処理が異常終了したときにlogfileを見て、FTPのエラーだったらさらにftpLog.txtを見る、みたいな感じでした。

なお、FTPサーバが返すコードについては下記RFCの4.2辺りを参照してください。もっとも、サーバによってこれら全てが実装されてるとは限りませんが。

http://hp.vector.co.jp/authors/VA002682/rfc959j.htm

No.1です。補足拝見しました。

直接ftpコマンドの戻り値では実行結果が判断できないので、私が以前に携わっていたプロジェクトでは、FTPサーバが出すエラーコードをgrepでハンドリングしていました。

FTPはコマンドの結果を「行頭に3桁の数字」で出力する仕様になっており、putもgetも送受信が成功した場合は226が出力されるので、

ftp -nv < ftpCom.txt > ftpLog.txt 2>&1

を例えにとると、このコマンドを実行した後に、
grep ^226 ftpLog.txt > /dev/null
if $? ne 0
then
echo "FTPでエラー...続きを読む

Qftpコマンドの戻り値をチェックしたい

現在業務でftpコマンドを用いたバックアップシェルを作成しております。(RHEL4)
クーロンでシェルAを呼び、シェルA内でftpコマンド発行→ファイルB内のftpコマンドを実行→シェルAに戻る、という仕様ですが、このftpコマンドが成功したのか失敗したのかをプログラム上で判断する方法はありますでしょうか?

Aベストアンサー

shogo0809さんの回答に便乗します。
実行ログをファイルに落としてgrepするのがよいと思います。
以前、似たような質問があったので
具体的な手順は参考URLのほうを見てはどうでしょうか?

→シェルスクリプトでFTPの実行結果を取得するには

参考URL:http://oshiete1.goo.ne.jp/qa2656080.html

QFTPの送信結果を検知したい

WindowsでFTPをバッチファイルから呼び出すことを考えています。FTPで送信エラーが発生した場合に、FTPのエラーとして検知したいのですが、その方法をご存じのかたおりましたら教えて下さい。(Windows-NTで標準で提供されるFTPを使用しています)直接私が確認したわけではありませんが、FTP送信でエラーが発生してもFTPの終了コードが0になってしまうらしく、FTPのエラーを検知できないそうです。WindowsであればWindows-NT以外の環境でもかまいませんので、ご存じのかたおりましたら教えて下さい。

Aベストアンサー

標準のツールでやるなら、ftpコマンドの出力をファイルにリダイレクトして、find か findstr コマンドで適当な文字列の有無で判断するしかないですね。

>FTPで転送後に転送先のホスト内のある処理が自動的に動き
とのことですが、転送先ホストで単純にデータファイルの有無で先に進むと、転送途中のファイルを読んだり、転送エラーで途中で終わったファイルを読んだりする可能性があるので、普通は、転送元でデータファイルの正常転送を確認後に目印ファイル(中身は空でよい)を送り、転送先では目印ファイルがあることでデータファイルが正しく受信できたことを判断して目印ファイルを消して先に進む(データファイルを処理する)のが良く使われる手法です。

Qftpコマンドを実行すると「425 Can't open connection」とエラーが出ます。

初めて質問させていただきます。

ブラウザでドメイン名を入力するとサーバー側のファイルを参照することができ、
また、FFFTPを用いてもサーバーのファイルを参照することができます。

しかし、コマンドプロンプト上でコマンド(ls)を入力すると「425 Can't open connection」となります。

コマンド「cd」を使ってリモートディレクトリには変更できるもようです。

以上、よろしくお願い致します。

Aベストアンサー

ポートが、ファイアウォールで塞がれているいるために「425 Can't open connection」となる場合があります。
ファイアウォールを一時的に「無効」にして試してみては?
または「コマンドプロンプト」を右クリック「管理者として実行」か「コマンドプロンプト(管理者)」実行


人気Q&Aランキング