FTP:Azure VM上的421数据超时

时间:2019-07-18 11:24:08

标签: python azure ftp ftplib

我有一个简单的脚本,可以通过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虚拟机。

  • 小于10MB的文件似乎可以正常下载。
  • 大于30MB的文件返回异常: 421数据超时。重新连接。抱歉。
  • 我在Azure上获得大约700 Mbps,而在我的家庭网络上只有大约8 Mbps。
  • 看起来像是超时。我可以看到文件已部分下载。

我尝试设置ftp.set_pasv(False),但是随后返回500 Illegal Port,这是可以预期的。我知道无论如何,被动是首选方法。

我还能做些什么来解决和解决此问题?

1 个答案:

答案 0 :(得分:1)

为您提供一些建议。

  1. 根据File Transfer ProtocolFTP may run in active or passive mode的Wiki页面,如下图所示。在活动模式下,客户端需要侦听端口以接收来自服务器的数据。但是,由于FTP服务器客户端的侦听端口是随机分配的,因此无法预先准备在NSG入站规则中添加端口。因此,您应在Azure VM的客户端上使用FTP.set_pasv(True)或不使用passive mode的{​​{1}}。

    enter image description here

    enter image description here

  2. 对于问题FTP.set_pasv(False),请检查FTP服务器中的超时设置,例如421 Data timeout. Reconnect. Sorry.文件data_connection_timeout文件的vsftpd.conf属性足够长的超时时间

  3. 尝试将vftp的值设置为长于ftplib.FTP(host='', user='', passwd='', acct='', timeout=None, source_address=None)函数的全局默认设置。

    enter image description here

  4. 尝试使用函数FTP.set_debuglevel(level)调试脚本输出的更多详细信息,以找出可能的原因。

    enter image description here

希望有帮助。