FTP 上传文件手动工作,但使用 Python ftplib 失败

Posted

技术标签:

【中文标题】FTP 上传文件手动工作,但使用 Python ftplib 失败【英文标题】:FTP upload file works manually, but fails using Python ftplib 【发布时间】:2011-03-21 22:53:10 【问题描述】:

我在 Debian 机器上安装了 vsFTP。当使用 ftp 命令手动上传文件时,就可以了。即,以下会话有效:

john@myhost:~$ ftp xxx.xxx.xxx.xxx 5111 连接到 xxx.xxx.xxx.xxx。 220 你好,欢迎使用我的 FTP 服务器。 姓名(xxx.xxx.xxx.xxx:john):ftpuser 331 请指定密码。 密码: 230 登录成功。 远程系统类型是 UNIX。 使用二进制模式传输文件。 ftp>把st.zip 本地:st.zip 远程:st.zip 200 PORT 命令成功。考虑使用 PASV。 150 确定发送数据。 226 文件接收正常。 12773 字节在 0.00 秒内发送 (277191.8 kB/s) ftp> 221 再见。

(请注意,如上所述,由于某种原因,我将 vsFTP 服务器配置为使用非默认端口,例如 5111)

现在,当我在 python 中编写脚本以编程方式上传文件时,它失败了。错误显示“超时”,如下面的会话所示:

john@myhost:~$ ipython Python 2.5.2(r252:60911,2010 年 1 月 24 日,14:53:14) 输入“copyright”、“credits”或“license”以获取更多信息。 IPython 0.8.4——增强的交互式 Python。 ? -> IPython 的功能介绍和概述。 %quickref -> 快速参考。 help -> Python 自己的帮助系统。 目的? -> 关于“对象”的详细信息。 ?object 也有效,??打印更多。 [1]中:导入ftplib 在[2]中:ftp=ftplib.FTP() [3]中:ftp.connect('xxx.xxx.xxx.xxx','5111') Out[3]: "220 你好,欢迎使用我的 FTP 服务器。" [4]中:ftp.login('ftpuser','ftpuser') Out[4]: '230 登录成功。' [5]中:f=open('st.zip','rb') 在 [6] 中: ftp.storbinary('STOR %s' % 'my_ftp_file.zip', f) -------------------------------------------------- ------------------------- 错误回溯(最近一次调用最后一次) ... /usr/lib/python2.5/ftplib.pyc 在 ntransfercmd(self, cmd, rest) 322 af,socktype,原型,佳能,sa = socket.getaddrinfo(主机,端口,0,socket.SOCK_STREAM)[0] 第323章 --> 324 conn.connect(sa) 325 如果休息不是无: 326 self.sendcmd(“REST %s”% 休息) /usr/lib/python2.5/socket.pyc in connect(self, *args) 错误:(110,'连接超时')

我猜我的 vsFTP 服务器中有一些错误的配置,但无法弄清楚。有人可以帮忙吗?

我的 vsFTP 配置是:

听=是 connect_from_port_20=是 监听端口=5111 ftp_data_port=5110 # 允许被动 FTP 模式 pasv_enable=YES pasv_min_port=5300 pasv_max_port=5400 max_per_ip=2

【问题讨论】:

这个问题/答案也有帮助***.com/questions/50060037/… 【参考方案1】:

在您尝试发送数据之前不会发生超时,因此您能够成功连接到服务器。我看到的唯一区别是 ftplib 默认使用被动模式,而您的命令行客户端似乎没有。尝试做

ftp.set_pasv(False)

在开始传输之前看看会发生什么。

请注意,非被动模式基本上已经过时,因为它不能跨 NAT 防火墙使用,因此您可能应该将 vsFTP 配置为允许被动模式。

【讨论】:

这行得通!谢谢吉姆。但是为什么 python ftplib 不能自动使用被动模式呢?我的 vsFTP 确实配置为允许被动模式。会不会是 vsFTP 的配置错误?我已经编辑了我的问题帖子并在那里添加了我的 vsftpd.conf。 问题不在 ftplib 中,而在 vsFTP 中,由于某种原因不允许被动模式。你确定 vsFTP 配置在正确的位置吗? 是的,Jim,这是 vsFTP 配置的问题。最后我找到了原因:我的vsFTP部署在一个NAT中。因此,即使我设置了 vsFTP 选项“pasv_enable=YES”,我也应该设置另一个选项“pasv_address=my.external.ip.address”。之后,一切正常!谢谢,感谢热情的社区!

以上是关于FTP 上传文件手动工作,但使用 Python ftplib 失败的主要内容,如果未能解决你的问题,请参考以下文章

Python脚本通过FTP上传文件

python之FTP上传和下载

Python:将文件上传到ftp问题

pythonftp给文件授权

http上传下载和ftp上传下载的原理一样吗?有啥差别?

Python下使用ftplib上传文件到ftp上