確かPASSIVE
に、FTP 接続でモードになっているかどうか、および接続の両端がそれをサポートできるかどうかに関連する問題のように思えます。
ftplibのドキュメントでは、デフォルトでオンになっていることが示唆されていますが、これは残念なことです。代わりにset_debuglevel
、低レベルのプロトコルが発生しているのを確認できる場所に移動し、現在のモードを確認することをお勧めします。これにより、続行方法に関する情報が得られるはずです。あなたがパッシブ モードになっていて、相手側が適切に処理できないか、または (できれば) 処理できないが、処理する必要があるかのいずれかです。
FTP および FTPS (ただし SFTP は除く) は、サーバーが実際の転送のためにクライアントに逆方向接続を行うように、またはクライアントが転送のためにサーバーに 2 番目の順方向接続を行うように構成できます。特に前者は、ネットワーク アドレス変換が関係するときはいつでも複雑になりがちです。TLS がなければ、一部のファイアウォールは実際に FTP セッション トラフィックを書き換えて魔法のように機能させることができますが、TLS では暗号化のために不可能です。
データを転送しようとすると、おそらく認証されてからタイムアウトになるという事実 (LIST では、一方向または他方向の 2 番目の接続が必要です) は、通常、パッシブ モードが必要なセットアップの典型的な症状です。
通常どおりポート 21 に接続し、認証前に FTP 制御接続を暗黙的に保護*します。データ接続を保護するには、ユーザーが prot_p() メソッドを呼び出して明示的に要求する必要があります。
ftps.prot_p() # switch to secure data connection
ftps.retrlines('LIST') # list directory content securely
SFTP の方がはるかに問題が少ないため、FTPS を使用することはあまりありませんが、そうしないと、遠端のサーバーが連携していない可能性があります。
*注、この文は、データ接続の明示的な保護とは対照的に、FTP_TLS が「暗黙的に FTP 制御接続を保護する」ことを言おうとしていると思われます。