2

PythonとTwistedフレームワークを使用してFTPサイトに接続し、さまざまな自動化されたタスクを実行しています。必要に応じて、FTPサーバーはたまたまPure-FTPdです。

FTPClientでlistメソッドに接続して呼び出す場合、結果のFTPFileListProtocolファイルコレクションには、スペース('')を含むディレクトリまたはファイル名が含まれません。

他の誰かがこれを見たことがありますか?FTPFileListProtocolのサブクラスを作成し、そのunknownLineメソッドをオーバーライドして、ファイル/ディレクトリ名を手動で解析する唯一の解決策はありますか?

4

2 に答える 2

2

まず、取得した FTP リストに対して自動化されたタスクを実行している場合は、 RFC 959 セクション 4.1.3に記載されているのでNLSTはなく、おそらく以下を参照する必要があります。LIST

名前リスト (NLST)
 ...
            このコマンドは、次の情報を返すことを目的としています。
            プログラムでさらに処理するために使用できます。
            ファイルを自動的に。

ツイストのドキュメントには次のように書かれていLISTます:

ほとんどの一般的なファイル リスト形式に対応できます。

これは私を疑わしくさせます。「対応」するソリューションは好きではありません。LIST機械処理ではなく、人間が消費することを目的としていました。

ターゲットサーバーがそれらをサポートしている場合は、 RFC 3659 セクション 7で定義されているように優先する必要がMLSTあります。MLSD

7.機械加工のリスト(MLSTおよびMLSD)

   MLST および MLSD コマンドは、ファイルを標準化し、
   サーバー FTP プロセスによって返されるディレクトリ情報。これらは
   コマンドは、その形式が LIST コマンドとは異なります。
   reply は厳密に定義されていますが、拡張可能です。

ただし、これらの新しいコマンドはターゲット サーバーでは使用できない可能性があり、Twisted では表示されません。したがってNLST、おそらくあなたの最善の策です。

問題の核心に関しては、3 つの原因が考えられます。

  1. 返された結果の処理が正しくありません (あなたが提案したように、またはおそらく他の場所で Twisted に問題がある可能性があります)。
  2. サーバーにバグがあり、正しい (完全な) 応答を送信していません
  3. 間違ったコマンドが送信されています (ストレートNLST/LISTではありそうにありませんが、これらのコマンドに引数が指定された場合、一部のサーバーは異なる反応を示します)

(2) と (3) を排除し、原因が (1) にあることを、何が送信されているかを見ることで証明できます。このオプションが Twisted API または Pure-FTPD サーバーのログ設定の一部として利用できない場合は、tcpdump、snoop、WireShark などのネットワーク スニファを解除する必要がある場合があります (これが許可されている場合)。あなたの環境)。制御接続 (ポート 21) だけでなく、データ接続もトレースする必要があることに注意してください ( LIST/NLSTコマンドの結果が含まれるため)。WireShark は、プロトコル レベルの分析を実行してくれるので便利です。

幸運を。

于 2008-11-22T11:33:06.613 に答える
0

これはどういうわけか予想されます。FTPFileListProtocolは、すべてのFTP出力を理解できるわけではありません。これは、一部が風変わりなためです。docstringで説明されているように:

奇抜なFTPサーバーに別の悪が必要な場合は、C{fileLinePattern}またはC{parseDirectoryLine()}のいずれかをオーバーライドできます。

この場合、それはバグである可能性があります。fileLinePatternを改善して、スペースを含むファイル名を理解できるようにすることができます。もしそうなら、ツイストトラッカーでバグを開くことを歓迎します。

于 2008-11-25T09:26:35.777 に答える