ftplib --- FTP 协议客户端

源代码: Lib/ftplib.py


此模块定义了 FTP 类和一些相关的条目。FTP 类实现了 FTP 协议的客户端。你可以用它来编写 Python 程序,执行各种自动化的 FTP 任务,比如镜像其他 FTP 服务器。它也被 urllib.request 模块用于处理使用 FTP 的 URL。有关 FTP(文件传输协议)的更多信息,请参阅互联网 RFC 959

遵循 RFC 2640,默认编码为 UTF-8。

可用性:非 WASI。

此模块在 WebAssembly 上不起作用或不可用。有关更多信息,请参阅 WebAssembly 平台

以下是使用 ftplib 模块的示例会话

>>> from ftplib import FTP
>>> ftp = FTP('ftp.us.debian.org')  # connect to host, default port
>>> ftp.login()                     # user anonymous, passwd anonymous@
'230 Login successful.'
>>> ftp.cwd('debian')               # change into "debian" directory
'250 Directory successfully changed.'
>>> ftp.retrlines('LIST')           # list directory contents
-rw-rw-r--    1 1176     1176         1063 Jun 15 10:18 README
...
drwxr-sr-x    5 1176     1176         4096 Dec 19  2000 pool
drwxr-sr-x    4 1176     1176         4096 Nov 17  2008 project
drwxr-xr-x    3 1176     1176         4096 Oct 10  2012 tools
'226 Directory send OK.'
>>> with open('README', 'wb') as fp:
>>>     ftp.retrbinary('RETR README', fp.write)
'226 Transfer complete.'
>>> ftp.quit()
'221 Goodbye.'

参考

FTP 对象

class ftplib.FTP(host='', user='', passwd='', acct='', timeout=None, source_address=None, *, encoding='utf-8')

返回一个 FTP 类的新实例。

参数:
  • host (str) -- 要连接的主机名。如果给出,构造函数会隐式调用 connect(host)

  • user (str) -- 用于登录的用户名(默认为 'anonymous')。如果给出,构造函数会隐式调用 login(host, passwd, acct)

  • passwd (str) -- 登录时使用的密码。如果未给出,且 passwd 是空字符串或 "-",则会自动生成一个密码。

  • acct (str) -- 用于 ACCT FTP 命令的账户信息。很少有系统实现这个功能。详见 RFC-959

  • timeout (float | None) -- 阻塞操作(如 connect())的超时时间,单位为秒(默认:全局默认超时设置)。

  • source_address (tuple | None) -- 一个二元组 (host, port),用作套接字在连接前绑定的源地址。

  • encoding (str) -- 目录和文件名的编码(默认:'utf-8')。

FTP 类支持 with 语句,例如:

>>> from ftplib import FTP
>>> with FTP("ftp1.at.proftpd.org") as ftp:
...     ftp.login()
...     ftp.dir()
...
'230 Anonymous login ok, restrictions apply.'
dr-xr-xr-x   9 ftp      ftp           154 May  6 10:43 .
dr-xr-xr-x   9 ftp      ftp           154 May  6 10:43 ..
dr-xr-xr-x   5 ftp      ftp          4096 May  6 10:43 CentOS
dr-xr-xr-x   3 ftp      ftp            18 Jul 10  2008 Fedora
>>>

在 3.2 版本发生变更: 添加了对 with 语句的支持。

在 3.3 版本发生变更: 添加了 source_address 参数。

在 3.9 版本发生变更: 如果 timeout 参数被设为零,它将引发 ValueError 以防止创建非阻塞套接字。添加了 encoding 参数,并且默认值从 Latin-1 更改为 UTF-8 以遵循 RFC 2640

有几个 FTP 方法提供了两种版本:一种用于处理文本文件,另一种用于处理二进制文件。这些方法以所使用的命令命名,后跟 lines 表示文本版本,或 binary 表示二进制版本。

FTP 实例有以下方法:

set_debuglevel(level)

将实例的调试级别设置为一个 int。这控制了打印的调试输出量。调试级别为:

  • 0 (默认):无调试输出。

  • 1:产生适量的调试输出,通常每个请求一行。

  • 2 或更高:产生最大量的调试输出,记录在控制连接上发送和接收的每一行。

connect(host='', port=0, timeout=None, source_address=None)

连接到给定的主机和端口。每个实例只应调用此函数一次;如果在创建 FTP 实例时给出了 host 参数,则不应调用此函数。所有其他 FTP 方法只能在成功建立连接后调用。

参数:
  • host (str) -- 要连接的主机。

  • port (int) -- 要连接的 TCP 端口(默认:21,由 FTP 协议规范指定)。很少需要指定不同的端口号。

  • timeout (float | None) -- 连接尝试的超时时间,单位为秒(默认:全局默认超时设置)。

  • source_address (tuple | None) -- 一个二元组 (host, port),用作套接字在连接前绑定的源地址。

触发一个参数为 self, host, port审计事件 ftplib.connect

在 3.3 版本发生变更: 添加了 source_address 参数。

getwelcome()

返回服务器在初始连接时发送的欢迎消息。(此消息有时包含可能与用户相关的免责声明或帮助信息。)

login(user='anonymous', passwd='', acct='')

登录到已连接的 FTP 服务器。每个实例在建立连接后只应调用此函数一次;如果在创建 FTP 实例时给出了 hostuser 参数,则不应调用此函数。大多数 FTP 命令只有在客户端登录后才被允许。

参数:
  • user (str) -- 用于登录的用户名(默认为 'anonymous')。

  • passwd (str) -- 登录时使用的密码。如果未给出,且 passwd 是空字符串或 "-",则会自动生成一个密码。

  • acct (str) -- 用于 ACCT FTP 命令的账户信息。很少有系统实现这个功能。详见 RFC-959

abort()

中止正在进行的文件传输。使用此方法并不总能成功,但值得一试。

sendcmd(cmd)

向服务器发送一个简单的命令字符串并返回响应字符串。

触发一个参数为 self, cmd审计事件 ftplib.sendcmd

voidcmd(cmd)

向服务器发送一个简单的命令字符串并处理响应。如果响应码表示成功(范围在 200-299 内),则返回响应字符串。否则引发 error_reply

触发一个参数为 self, cmd审计事件 ftplib.sendcmd

retrbinary(cmd, callback, blocksize=8192, rest=None)

以二进制传输模式检索文件。

参数:
  • cmd (str) -- 一个合适的 RETR 命令:"RETR filename"

  • callback (callable) -- 一个接受单个参数的可调用对象,每接收一个数据块时就会被调用,其唯一的参数是作为 bytes 的数据。

  • blocksize (int) -- 在为实际传输创建的底层 socket 对象上读取的最大块大小。这也对应于将传递给 callback 的最大数据大小。默认为 8192

  • rest (int) -- 一个要发送到服务器的 REST 命令。请参阅 transfercmd() 方法的 rest 参数文档。

retrlines(cmd, callback=None)

使用在初始化时指定的 encoding 参数,以该编码检索文件或目录列表。cmd 应该是一个合适的 RETR 命令(参见 retrbinary())或一个如 LISTNLST 的命令(通常只是字符串 'LIST')。LIST 检索文件列表及其信息。NLST 检索文件名列表。对每一行调用 callback 函数,其参数为去除了末尾 CRLF 的字符串。默认的 callback 将行打印到 sys.stdout

set_pasv(val)

如果 val 为真,启用“被动”模式,否则禁用被动模式。被动模式默认开启。

storbinary(cmd, fp, blocksize=8192, callback=None, rest=None)

以二进制传输模式存储文件。

参数:
  • cmd (str) -- 一个合适的 STOR 命令:"STOR filename"

  • fp (file object) -- 一个文件对象(以二进制模式打开),将一直读取到 EOF,使用其 read() 方法以 blocksize 大小的块提供要存储的数据。

  • blocksize (int) -- 读取块的大小。默认为 8192

  • callback (callable) -- 一个接受单个参数的可调用对象,每发送一个数据块时就会被调用,其唯一的参数是作为 bytes 的数据。

  • rest (int) -- 一个要发送到服务器的 REST 命令。请参阅 transfercmd() 方法的 rest 参数文档。

在 3.2 版本发生变更: 添加了 rest 参数。

storlines(cmd, fp, callback=None)

以行模式存储文件。cmd 应该是一个合适的 STOR 命令(参见 storbinary())。使用 file object fp(以二进制模式打开)的 readline() 方法读取行直到 EOF,以提供要存储的数据。callback 是一个可选的单参数可调用对象,在每行发送后被调用。

transfercmd(cmd, rest=None)

通过数据连接发起一次传输。如果传输是主动的,发送一个 EPRTPORT 命令和由 cmd 指定的传输命令,并接受连接。如果服务器是被动的,发送一个 EPSVPASV 命令,连接到它,并开始传输命令。无论哪种方式,都返回连接的套接字。

如果给出了可选的 rest,会向服务器发送一个 REST 命令,并将 rest 作为参数传递。rest 通常是所请求文件中的一个字节偏移量,告诉服务器从请求的偏移量处重新开始发送文件字节,跳过初始字节。但请注意,transfercmd() 方法会使用在初始化时指定的 encoding 参数将 rest 转换为字符串,但不会对字符串内容进行检查。如果服务器不识别 REST 命令,将引发 error_reply 异常。如果发生这种情况,只需不带 rest 参数调用 transfercmd() 即可。

ntransfercmd(cmd, rest=None)

transfercmd() 类似,但返回一个包含数据连接和预期数据大小的元组。如果无法计算预期大小,则预期大小将返回 Nonecmdrest 的含义与 transfercmd() 中相同。

mlsd(path='', facts=[])

使用 MLSD 命令 (RFC 3659) 以标准化格式列出目录。如果省略 path,则假定为当前目录。facts 是一个字符串列表,表示所需信息的类型(例如 ["type", "size", "perm"])。返回一个生成器对象,为在 path 中找到的每个文件生成一个包含两个元素的元组。第一个元素是文件名,第二个元素是一个包含有关文件名事实的字典。此字典的内容可能受 facts 参数限制,但服务器不保证返回所有请求的事实。

在 3.3 版本加入。

nlst(argument[, ...])

返回由 NLST 命令返回的文件名列表。可选的 argument 是要列出的目录(默认为当前服务器目录)。可以使用多个参数向 NLST 命令传递非标准选项。

备注

如果你的服务器支持该命令,mlsd() 提供了更好的 API。

dir(argument[, ...])

生成由 LIST 命令返回的目录列表,并将其打印到标准输出。可选的 argument 是要列出的目录(默认为当前服务器目录)。可以使用多个参数向 LIST 命令传递非标准选项。如果最后一个参数是一个函数,它将被用作像 retrlines() 一样的 callback 函数;默认打印到 sys.stdout。此方法返回 None

备注

如果你的服务器支持该命令,mlsd() 提供了更好的 API。

rename(fromname, toname)

将服务器上的文件 fromname 重命名为 toname

delete(filename)

从服务器上删除名为 filename 的文件。如果成功,返回响应的文本,否则在权限错误时引发 error_perm,在其他错误时引发 error_reply

cwd(pathname)

设置服务器上的当前目录。

mkd(pathname)

在服务器上创建一个新目录。

pwd()

返回服务器上当前目录的路径名。

rmd(dirname)

删除服务器上名为 dirname 的目录。

size(filename)

请求服务器上名为 filename 的文件的大小。成功时,文件大小以整数形式返回,否则返回 None。请注意,SIZE 命令不是标准化的,但许多常见的服务器实现都支持它。

quit()

向服务器发送一个 QUIT 命令并关闭连接。这是一种“礼貌”地关闭连接的方式,但如果服务器对 QUIT 命令响应错误,可能会引发异常。这隐含地调用了 close() 方法,这将使 FTP 实例在后续调用中变得无用(见下文)。

close()

单方面关闭连接。这不应应用于已经关闭的连接,例如在成功调用 quit() 之后。此调用后,不应再使用 FTP 实例(在调用 close()quit() 后,你不能通过发出另一个 login() 方法来重新打开连接)。

FTP_TLS 对象

class ftplib.FTP_TLS(host='', user='', passwd='', acct='', *, context=None, timeout=None, source_address=None, encoding='utf-8')

一个 FTP 的子类,它按照 RFC 4217 的描述为 FTP 添加了 TLS 支持。连接到端口 21,在身份验证前隐式地保护 FTP 控制连接。

备注

用户必须通过调用 prot_p() 方法来显式地保护数据连接。

参数:
  • host (str) -- 要连接的主机名。如果给出,构造函数会隐式调用 connect(host)

  • user (str) -- 用于登录的用户名(默认为 'anonymous')。如果给出,构造函数会隐式调用 login(host, passwd, acct)

  • passwd (str) -- 登录时使用的密码。如果未给出,且 passwd 是空字符串或 "-",则会自动生成一个密码。

  • acct (str) -- 用于 ACCT FTP 命令的账户信息。很少有系统实现这个功能。详见 RFC-959

  • context (ssl.SSLContext) -- 一个 SSL 上下文对象,允许将 SSL 配置选项、证书和私钥捆绑到一个单一的、可能长期存在的结构中。请阅读 安全考量 以了解最佳实践。

  • timeout (float | None) -- 阻塞操作(如 connect())的超时时间,单位为秒(默认:全局默认超时设置)。

  • source_address (tuple | None) -- 一个二元组 (host, port),用作套接字在连接前绑定的源地址。

  • encoding (str) -- 目录和文件名的编码(默认:'utf-8')。

在 3.2 版本加入。

在 3.3 版本发生变更: 添加了 source_address 参数。

在 3.4 版更改: 该类现在支持通过 ssl.SSLContext.check_hostname 进行主机名检查和*服务器名称指示*(参见 ssl.HAS_SNI)。

在 3.9 版本发生变更: 如果 timeout 参数被设为零,它将引发 ValueError 以防止创建非阻塞套接字。添加了 encoding 参数,并且默认值从 Latin-1 更改为 UTF-8 以遵循 RFC 2640

在 3.12 版更改: 已移除已弃用的 keyfilecertfile 参数。

以下是使用 FTP_TLS 类的示例会话

>>> ftps = FTP_TLS('ftp.pureftpd.org')
>>> ftps.login()
'230 Anonymous user logged in'
>>> ftps.prot_p()
'200 Data protection level set to "private"'
>>> ftps.nlst()
['6jack', 'OpenBSD', 'antilink', 'blogbench', 'bsdcam', 'clockspeed', 'djbdns-jedi', 'docs', 'eaccelerator-jedi', 'favicon.ico', 'francotone', 'fugu', 'ignore', 'libpuzzle', 'metalog', 'minidentd', 'misc', 'mysql-udf-global-user-variables', 'php-jenkins-hash', 'php-skein-hash', 'php-webdav', 'phpaudit', 'phpbench', 'pincaster', 'ping', 'posto', 'pub', 'public', 'public_keys', 'pure-ftpd', 'qscan', 'qtc', 'sharedance', 'skycache', 'sound', 'tmp', 'ucarp']

FTP_TLS 类继承自 FTP,并定义了这些额外的方法和属性:

ssl_version

要使用的 SSL 版本(默认为 ssl.PROTOCOL_SSLv23)。

auth()

根据 ssl_version 属性中的指定,使用 TLS 或 SSL 建立一个安全的控制连接。

在 3.4 版本发生变更: 该方法现在支持通过 ssl.SSLContext.check_hostname 和*服务器名称指示*(参见 ssl.HAS_SNI)进行主机名检查。

ccc()

将控制通道恢复为明文。这对于利用那些知道如何处理非安全 FTP 的 NAT 防火墙而无需打开固定端口很有用。

在 3.3 版本加入。

prot_p()

建立安全的数据连接。

prot_c()

建立明文数据连接。

模块变量

exception ftplib.error_reply

当从服务器收到意外回复时引发的异常。

exception ftplib.error_temp

当收到表示临时错误的错误代码(响应码在 400-499 范围内)时引发的异常。

exception ftplib.error_perm

当收到表示永久性错误的错误代码(响应码在 500-599 范围内)时引发的异常。

exception ftplib.error_proto

当从服务器收到的回复不符合文件传输协议的响应规范时(即,不以 1-5 范围内的数字开头)引发的异常。

ftplib.all_errors

FTP 实例的方法可能因 FTP 连接问题(而不是调用者造成的编程错误)而引发的所有异常的集合(以元组形式)。该集合包括上面列出的四个异常以及 OSErrorEOFError

参见

模块 netrc

.netrc 文件格式的解析器。FTP 客户端通常使用 .netrc 文件在提示用户之前加载用户认证信息。