1

apache.commons.net v.2.2を使用して独自のFTPSクライアントを作成しており、apache.commons.net.ftp.FTPClientでlistNames()を使用しようとしていますが、apache.commons.net.ftpでタイムアウトになっています。 .FTPListParseEngine.java行152

    String line = this.parser.readNextEntry(reader);

クライアントがTLSを使用して認証し、データを転送する前にCCCモードにドロップする必要があります。サーバーに接続して現在の作業ディレクトリを取得することはできますが、LIST/RETRコマンドがタイムアウトします。これは、現在の実装のログです。

FTPS: Connecting to: XXXXXXXXXXXXXXXXX.com
FTPS: REPLY: 220 UNAUTHORIZED ACCESS TO THIS SYSTEM IS STRICTLY PROHIBITED.
FTPS: COMMAND: AUTH TLS
FTPS: REPLY: 234 AUTH TLS-C/TLS OK.
FTPS: Switching to passive mode in the middle of a session
FTPS: Logging in with user: XXXXXXXXX
FTPS: COMMAND: USER XXXXXXXXXXXX
FTPS: REPLY: 331 Password required for XXXXXXXXXXX.
FTPS: COMMAND: PASS **********
FTPS: REPLY: 230 Connect:Enterprise UNIX login ok, access restrictions apply.
FTPS: COMMAND: PBSZ 0
FTPS: REPLY: 200 PBSZ 0 OK.
FTPS: COMMAND: PROT P
FTPS: REPLY: 200 PROT P OK, data channel will be secured.
FTPS: Dropping to CCC mode
FTPS: COMMAND: CCC
FTPS: REPLY: 200 CCC Context Enabled.
FTPS: Setting Transfer Type to Binary
FTPS: COMMAND: TYPE I
FTPS: REPLY: 200 Type set to I.
FTPS: COMMAND: SYST
FTPS: REPLY: 215 UNKNOWN Type: L8
ftpClient.getSystemType() UNKNOWN Type: L8
FTPS: COMMAND: PWD
FTPS: REPLY: 257 "/XXXXXXXXXXXXX" is current directory.
FTPS: COMMAND: PASV
FTPS: REPLY: 227 Entering Passive Mode (XXX,XXX,XXX,XXX,XXX,XXX)
FTPS: COMMAND: LIST
FTPS: REPLY: 150 Opening BINARY mode data connection for ...
FTPS: java.lang.RuntimeException: java.net.SocketTimeoutException: Read timed out

Wiresharkでは、他のクライアントがデータ接続を開いた直後にFTP-DATAパケットを送信することに気付きましたが、私たちの実装では、そのようなパケットを送信しません。これが問題の原因である可能性がありますが、修正方法がわかりません。

4

1 に答える 1

0

詳細については、実際に実行しているコードをお尋ねします。

ただし、予備的な応答として、同様の問題が発生したため、apache commonsが実際にオブジェクト指向の方法でリクエストを作成しているのではなく、呼び出し時に各コマンドをサーバーに送信していることを確認してください(たとえば、ftpClient.enterLocalPassiveMode()を呼び出すとすぐにPASV)、それはいくつかの混乱を引き起こす可能性があります。その点で、この状況で発生する可能性が高いエラーは、適切なタイミング(接続後、ログイン前)にパッシブモードに移行しないことです。

listnamesが機能しない場合は、おそらく何も機能しません。

于 2013-02-28T00:42:14.293 に答える