FTP 服务器在请求不存在的文件时挂起 ("FTP no transfer timeout")
FTP server hangs when non-existing files are requested ("FTP no transfer timeout")
我有一个 ProFTPD FTP 服务器(版本:1.3.4d(维护)),它可以很好地处理现有文件,但如果 "FTP no transfer timeout" 出现 请求了不存在的文件。
这是我在请求不存在的文件时在 proftpd.log
中看到的内容:
May 20 12:05:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): FTP session opened.
May 20 12:05:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): USER system: Login successful.
...hangs for 10 Minutes....
May 20 12:15:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): Passive data transfer failed, possibly due to network issues
May 20 12:15:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): Check your PassivePorts and MasqueradeAddress settings,
May 20 12:15:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): and any router, NAT, and firewall rules in the network path.
May 20 12:15:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): FTP no transfer timeout, disconnected
May 20 12:15:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): ROOT PRIVS: unable to setegid(): Operation not permitted
May 20 12:15:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): RELINQUISH PRIVS: unable to seteuid(session.uid): Operation not permitted
May 20 12:15:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): FTP session closed.
这些是在 proftpd.conf
中配置的超时:
TimeoutNoTransfer 600
TimeoutStalled 600
TimeoutIdle 1200
但是,向同一台服务器请求现有文件工作正常。
有人可以帮我解决这个问题吗?
我的问题出在 FTP 客户端,而不是 FTP 服务器。我搭建了一个小型的FtpTester测试工具,可以重现问题,这似乎是EnterpriseDT的edtFTPj FTP客户端的一个bug。如果您在一个不存在的文件上打开一个 FTPInputStream 并在收到 IOException 后关闭它,则 close() 操作将挂起,直到发生套接字超时。
我在 EnterpriseDT 的网站上对此进行了详细描述,请参见。 http://enterprisedt.com/questions/index.php/11407/ftpinputstream-close-hangs-until-socket-timeout
我用这个解决方法解决了我的问题:在打开 FTPInputStream 之前,我明确检查文件是否存在。
我有一个 ProFTPD FTP 服务器(版本:1.3.4d(维护)),它可以很好地处理现有文件,但如果 "FTP no transfer timeout" 出现 请求了不存在的文件。
这是我在请求不存在的文件时在 proftpd.log
中看到的内容:
May 20 12:05:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): FTP session opened.
May 20 12:05:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): USER system: Login successful.
...hangs for 10 Minutes....
May 20 12:15:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): Passive data transfer failed, possibly due to network issues
May 20 12:15:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): Check your PassivePorts and MasqueradeAddress settings,
May 20 12:15:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): and any router, NAT, and firewall rules in the network path.
May 20 12:15:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): FTP no transfer timeout, disconnected
May 20 12:15:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): ROOT PRIVS: unable to setegid(): Operation not permitted
May 20 12:15:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): RELINQUISH PRIVS: unable to seteuid(session.uid): Operation not permitted
May 20 12:15:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): FTP session closed.
这些是在 proftpd.conf
中配置的超时:
TimeoutNoTransfer 600
TimeoutStalled 600
TimeoutIdle 1200
但是,向同一台服务器请求现有文件工作正常。
有人可以帮我解决这个问题吗?
我的问题出在 FTP 客户端,而不是 FTP 服务器。我搭建了一个小型的FtpTester测试工具,可以重现问题,这似乎是EnterpriseDT的edtFTPj FTP客户端的一个bug。如果您在一个不存在的文件上打开一个 FTPInputStream 并在收到 IOException 后关闭它,则 close() 操作将挂起,直到发生套接字超时。
我在 EnterpriseDT 的网站上对此进行了详细描述,请参见。 http://enterprisedt.com/questions/index.php/11407/ftpinputstream-close-hangs-until-socket-timeout
我用这个解决方法解决了我的问题:在打开 FTPInputStream 之前,我明确检查文件是否存在。