使用Python和ftplib进行FTP上传错误。

时间:2015-06-03 19:53:42

标签: python ftplib ftps

我正在尝试运行一个简单的ftps脚本,以便按计划将文件从Linux机器上传到运行在Windows Server 2012上的ftps实例。当我尝试在桌面上测试脚本(OS x)时,脚本出错:

  

上传文件时出错:[Errno 54]通过对等方重置连接

如果我在linux机器上运行脚本,同样的错误,除了104而不是54:

  

上传文件时出错:[Errno 104]通过对等方重置连接

我上传的文件是空的或是8个字节。我已经验证ftps正在与我桌面上的其他2个客户端一起使用。我错过/忽视了什么?

#!/usr/bin/env python
from ftplib import FTP_TLS
import fnmatch
import os
import ssl
import sys

server = '192.168.1.2'
user = 'myUsername'
passwd = 'myPassword'

def connect_ftp():
    ftp = FTP_TLS(server, user, passwd)
    ftp.set_pasv(True)
    ftp.prot_p()

    return ftp

def upload_file(ftp_connection, upload_file_path):
    try:
        upload_file = open("/tmp/test/" + upload_file_path, 'r')
        print('Uploading ' + upload_file_path + "...")
        ftp_connection.storbinary('STOR ' + upload_file_path, upload_file)
        ftp_connection.quit()
        ftp_connection.close()
        upload_file.close()
        print('Upload finished.')

    except Exception, e:
        print("Error uploading file: " + str(e))

ftp_conn = connect_ftp()


for file in os.listdir('/tmp/test'):
        if fnmatch.fnmatch(file, 'bt_*.txt'):
            upload_file(ftp_conn, file)

2 个答案:

答案 0 :(得分:1)

我认为此问题仅在MS FTP服务器上显示。 首先打开调试

ftp.set_debuglevel(2)

在我的情况下转移挂起

  

' STOR test.xml \ r \ n'

     

获取' 125数据连接已打开;转移开始。\ n'

     

resp ' 125数据连接已打开;转移开始。'

然后我发现了这个问题http://www.sami-lehtinen.net/blog/python-32-ms-ftps-ssl-tls-lockup-fix 我已经尝试过(在storbinary中评论过conn.unwrap())它并且它有效! 在我的情况下是第513行

        # shutdown ssl layer
        if _SSLSocket is not None and isinstance(conn, _SSLSocket):
            pass #conn.unwrap()

这是一个非常糟糕的黑客,但我找不到更好的东西。

答案 1 :(得分:0)

我遇到了同样的问题,并通过以下代码成功解决了这个问题:

ftps = FTP_TLS(server)
ftps.set_debuglevel(2) # To show logs
ftps.ssl_version = ssl.PROTOCOL_TLS
ftps.set_pasv(True)
ftps.login(user="user", passwd="passwd")

然后我从Python 3.5.1切换到Python 3.8.3