我有一个简单的脚本,可以通过FTP成功下载75MB的文件:
try:
ftp = ftplib.FTP(host)
ftp.login(username, password)
ftp.cwd(source_dir)
except ftplib.all_errors as e:
print('Ftp error = ', e)
return False
# Check filename exists
if filename in ftp.nlst():
local_filename = os.path.join(dest_dir, filename)
lf = open(local_filename, "wb")
ftp.retrbinary("RETR " + filename, lf.write)
lf.close()
print(filename, ' successfully downloaded')
else:
print(filename, ' not found in the path ', source_dir)
ftp.quit()
从Spyder IDE或Windows计划的任务运行时,此脚本在我的家用和便携式笔记本电脑上均可正常运行。
我已将完全相同的脚本部署到Azure上的Windows虚拟机。
我尝试设置ftp.set_pasv(False),但是随后返回500 Illegal Port,这是可以预期的。我知道无论如何,被动是首选方法。
我还能做些什么来解决和解决此问题?
答案 0 :(得分:1)
为您提供一些建议。
根据File Transfer Protocol,FTP may run in active or passive mode
的Wiki页面,如下图所示。在活动模式下,客户端需要侦听端口以接收来自服务器的数据。但是,由于FTP服务器客户端的侦听端口是随机分配的,因此无法预先准备在NSG入站规则中添加端口。因此,您应在Azure VM的客户端上使用FTP.set_pasv(True)
或不使用passive mode
的{{1}}。
对于问题FTP.set_pasv(False)
,请检查FTP服务器中的超时设置,例如421 Data timeout. Reconnect. Sorry.
文件data_connection_timeout
文件的vsftpd.conf
属性足够长的超时时间
尝试将vftp
的值设置为长于ftplib.FTP(host='', user='', passwd='', acct='', timeout=None, source_address=None)
函数的全局默认设置。
尝试使用函数FTP.set_debuglevel(level)
调试脚本输出的更多详细信息,以找出可能的原因。
希望有帮助。