FTP_TLS连接,被动模式,超时解决
###### 问题遇到的现象和发生背景 一直用FileZilla工具拖拽文件上传FTP,于是写个py智能化上传,连接可以正常登陆,使用ftp.retrlines(LIST)、等操作时却超时,且不能用主动模ftp.set_pasv(False),在FileZilla工具看到“服务器发回了不可路由的地址。使用服务器地址代替”,被动模式错误后,使用服务器的外部IP地址来代替,那么py该怎么写?
``` 正常创建ftp及登陆流程,以用使用LIST命令 ```python ftp = FTP_TLS() ftp.set_debuglevel(1) ftp.connect(host=****,port=**) ftp.login(***,****) ftp.retrlines(LIST) ftp.quit() ```
```
###### 运行结果及报错内容 能看到登陆正常,进入被动模式,LIST命令后就报错超时了,并不能列出ftp服务器上的远程目录。 ```python *resp* 220 Welcome to ftp! *cmd* AUTH TLS *resp* 234 AUTH TLS successful. *cmd* USER *** *resp* 331 Username ok, send password. *cmd* PASS **************** *resp* 230 Login successful. *cmd* TYPE A *resp* 200 Type set to: ASCII. *cmd* PASV *resp* 227 Entering passive mode (10,104,161,3,185,209). Traceback (most recent call last): ftp.retrlines(LIST) File "D:Program FilesPythonlibftplib.py", line 469, in retrlines with self.transfercmd(cmd) as conn, File "D:Program FilesPythonlibftplib.py", line 400, in transfercmd return self.ntransfercmd(cmd, rest)[0] File "D:Program FilesPythonlibftplib.py", line 799, in ntransfercmd conn, size = FTP.ntransfercmd(self, cmd, rest) File "D:Program FilesPythonlibftplib.py", line 362, in ntransfercmd source_address=self.source_address) File "D:Program FilesPythonlibsocket.py", line 724, in create_connection raise err File "D:Program FilesPythonlibsocket.py", line 713, in create_connection sock.connect(sa) TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
Process finished with exit code 1
```
Process finished with exit code 1
###### 我的解答思路和尝试过的方法 重写FTP_TLS类的makepasv方法,PASV命令返回了错误的ip地址,返回10,104,161,3,这是仅在本地网络中可用的ip,客户端采用忽略给定的ip并改用控制连接的ip来解决此问题。 ```python class MyTlsFtp(FTP_TLS): def makepasv(self) -> Tuple[str, int]: host,port = super(MyTlsFtp, self).makepasv() host = self.sock.getpeername()[0] return host, port
``` ftp = FTP_TLS()改成ftp = MyTlsFtp()自己定义的修改makepasv方法后的类即可
###### 我想要达到的结果 正常列出远程目录下的文件
```python *resp* 227 Entering passive mode (10,104,161,3,192,215). *cmd* LIST *resp* 125 Data connection already open. Transfer starting. -rw-rw-r-- 1 www www 512 Dec 16 2014 **.xml -rw-rw-r-- 1 www www 0 Dec 16 2014 **.x -rw-rw-r-- 1 www www 547 Dec 16 2014 **.xml -rw-r--r-- 1 www www 4494 Oct 13 2015 **.txt *resp* 226 Transfer complete. *cmd* QUIT *resp* 221 Goodbye. ```