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 回答