質問

Pythonと Twisted フレームワークを使用してFTPサイトに接続し、さまざまな自動タスクを実行しています。 FTPサーバーは、関連する場合はたまたまPure-FTPdです。

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

これを見た人はいますか? FTPFileListProtocolのサブクラスを作成し、その unknownLine メソッドをオーバーライドして、ファイル/ディレクトリ名を手動で解析する唯一のソリューションですか?

役に立ちましたか?

解決

まず、取得したFTPリストで自動化されたタスクを実行している場合、LIST ではなく、 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 は、機械処理ではなく人間による消費を目的としています。

ターゲットサーバーでサポートされている場合は、MLST および 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つの原因が考えられます。

  1. 返された結果の処理が正しくありません(あなたが示唆するように、おそらくどこか他の場所でTwistedに問題がある可能性があります)
  2. サーバーにバグがあり、正しい(完全な)応答を送信していない
  3. 間違ったコマンドが送信されています( 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トラッカーでバグを開いてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top