FTPS文件传输到rem时握手操作超时

2024-04-29 05:40:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我在尝试使用SSL/TLS上的ftp将文件推送到远程ftp服务器时遇到了一个奇怪的错误。我在网上找不到任何解决方案:/ 请帮忙。在

我的代码是:

from ftplib import FTP_TLS
import sys, os
root = "\\home\\user\\test.txt"
dest = "/Destdir"
ftps = FTP_TLS('xxx.xxx.xxx.xxx')
ftps.set_debuglevel(1)
ftps.set_pasv(False)
ftps.connect(port=21, timeout=80)
ftps.login('user', 'pass')
ftps.prot_p()
ftps.ccc()
try:
    ftps.cwd(dest)
except Exception as e:
    print(e)
try:
    file = open('test.txt', 'rb')
    ftps.storbinary('STOR test.txt', file)
    file.close()
except Exception as e:
    print(e)
ftps.close()

下面是脚本的输出:

^{pr2}$

由于连接到远程FTP服务器很好,所以我想这不是防火墙问题。在

注: 远程FTP服务器是一个具有最新操作系统的Synology NAS。在

编辑0:

另一个被动模式的尝试给出了这样的结果:

*resp* '220 nas FTP server ready.'
*cmd* 'AUTH TLS'
*resp* '234 AUTH TLS command successful.'
*cmd* 'USER user'
*resp* '331 Password required for user.'
*cmd* 'PASS **********'
*resp* '230 User user logged in.'
*cmd* 'PBSZ 0'
*resp* '200 PBSZ command successful (PBSZ=0).'
*cmd* 'PROT P'
*resp* '200 Protection level set to Private.'
*cmd* 'CCC'
*resp* '200 Clearing control channel protection.'
*cmd* 'CWD /Destdir'
*resp* '250 CWD command successful.'
*cmd* 'TYPE I'
*resp* '200 Type set to I.'
*cmd* 'PASV'
*resp* '227 Entering Passive Mode (xxx,xxx,xxx,xxx,216,241)'
*cmd* 'STOR test.txt'
*resp* "150 Opening BINARY mode data connection for 'test.txt'."
_ssl.c:704: The handshake operation timed out

我也尝试了扩展被动模式,但也没用:

*resp* '250 CWD command successful.'
*cmd* 'TYPE I'
*resp* '200 Type set to I.'
*cmd* 'EPSV'
*resp* '229 Entering Extended Passive Mode (|||55536|)'
*cmd* 'STOR test.txt'
*resp* "150 Opening BINARY mode data connection for 'test.txt'."
_ssl.c:704: The handshake operation timed out

编辑1: 所以脚本部分工作,它能够打开连接,开始文件传输。文件get已在远程服务器上创建,但它与源文件包含的数据不同。目标文件的大小为1KB,只有一些随机字符(文件是ANSII编码的,而源文件是UTF8。 同时,我可以使用WinSCP成功地上传一个文件。在


Tags: 文件testtxtcmd远程tlsftpresp
2条回答

您使用FTP活动模式:

ftps.set_pasv(False)

从你的评论来看,你似乎没有充分的理由这么做。在

FTP活动模式通常不起作用,因为它要求客户端能够接受传入的连接。如果不打开本地(包括Windows和本地网络)防火墙和/或配置NAT,这通常是不可能的。甚至不要尝试使用活动模式,除非你有非常明确的理由这样做。使用被动模式。只需删除^{}调用。被动模式是ftplib中的默认模式。在

有关详细信息,请参阅我在FTP connection modes上的文章。在

这很可能是防火墙问题。FTP相当特殊,因为它每次传输使用不同的连接。根据您的跟踪,当前工作的连接是命令连接,它由客户机建立,目标是服务器FTP端口(通常为21)。在

数据连接是独立连接。在活动模式下,它由服务器建立,源于FTP-DATA端口(20),目标是客户机在其PORT命令中发送的端口。在被动模式下,服务器发送一个端口,在那里它将监听它对PASV命令的响应中的数据连接,客户机尝试打开一个新的连接到那个(几乎是随机的)端口。在

这意味着除非防火墙允许较大的地址范围,或者防火墙软件实现特殊处理以动态地允许FTP命令中传递的地址,否则防火墙可以允许命令连接,然后阻止任何数据连接。在

参考文献:

相关问题 更多 >