ツイストFTP FileListプロトコルとスペースを含むファイル名
質問
Pythonと Twisted フレームワークを使用してFTPサイトに接続し、さまざまな自動タスクを実行しています。 FTPサーバーは、関連する場合はたまたまPure-FTPdです。
FTPClient で list メソッドを接続して呼び出すと、結果の FTPFileListProtocol の files コレクションはスペース( '')を含むディレクトリまたはファイル名は含まれません。
これを見た人はいますか? FTPFileListProtocolのサブクラスを作成し、その unknownLine メソッドをオーバーライドして、ファイル/ディレクトリ名を手動で解析する唯一のソリューションですか?
解決
まず、取得したFTPリストで自動化されたタスクを実行している場合、 NLST
を参照する必要があります。 http://tools.ietf.org/html/rfc959#page-33 "rel =" nofollow noreferrer "> RFC 959セクション4.1.3 :
NAME LIST (NLST) ... This command is intended to return information that can be used by a program to further process the files automatically.
ツイストドキュメント code> LIST のコメント:
It can cope with most common file listing formats.
これは私を疑わしいものにします。 「コープ」というソリューションは好きではありません。 LIST
は、機械処理ではなく人間による消費を目的としています。
ターゲットサーバーでサポートされている場合は、 MLSD
を選択する必要があります。 rfc3659#section-7 "rel =" nofollow noreferrer "> RFC 3659セクション7 :
7. Listings for Machine Processing (MLST and MLSD) The MLST and MLSD commands are intended to standardize the file and directory information returned by the server-FTP process. These commands differ from the LIST command in that the format of the replies is strictly defined although extensible.
ただし、これらの新しいコマンドはターゲットサーバーで使用できない場合があり、Twistedには表示されません。したがって、おそらく NLST
が最善の策です。
問題の核心については、次の3つの原因が考えられます。
- 返された結果の処理が正しくありません(あなたが示唆するように、おそらくどこか他の場所でTwistedに問題がある可能性があります)
- サーバーにバグがあり、正しい(完全な)応答を送信していない
- 間違ったコマンドが送信されています(
NLST
/LIST
とは異なりますが、これらのコマンドに引数が指定された場合、サーバーの反応が異なります)
(2)と(3)を削除し、原因が(1)であることを証明するには、回線を介して送信されるものを調べます。 Twisted APIまたはPure-FTPDサーバーロギング設定の一部としてこのオプションを使用できない場合、tcpdump、snoop、WireSharkなどのネットワークスニファーを展開する必要がある場合があります(これを行うことが許可されている場合)あなたの環境)。制御接続(ポート21)だけでなく、データ接続( LIST
/ NLST
コマンドの結果を運ぶため)もトレースする必要があることに注意してください。 WireSharkは、プロトコルレベルの分析を実行するので便利です。
がんばって。
他のヒント
これは何らかの形で予想されています。 FTPFileListProtocolはすべてのFTP出力を理解することはできません。これは、いくつかの風変わりなものもあるからです。 docstringで説明されているとおり:
風変わりなFTPサーバーに別の悪が必要な場合、次のことができます。 C {fileLinePattern}またはC {parseDirectoryLine()}をオーバーライドします。
この場合、バグの可能性があります。fileLinePatternを改善して、スペースを含むファイル名を理解できるようにすることができます。その場合は、Twistedトラッカーでバグを開いてください。