跳转到主要内容

非常快速的异步FTP服务器库

项目描述

Downloads Github stars Github forks Contributors
Latest version Binary packages License
GH actions Documentation Status Twitter Follow

关于

Python FTP 服务器库提供了一个高级可移植接口,可以轻松编写非常高效、可扩展和异步的 FTP 服务器。它是 Python 编程语言中最完整、符合 RFC-959 的 FTP 服务器实现。

特性

  • 极其 轻量级快速可扩展(见 原因基准测试)。

  • 使用 sendfile(2) 系统调用进行上传。

  • 使用 epoll() / kqueue() / select() 异步处理并发。

  • ……但可以选择跳转到 多线程/多进程 模型(例如:你可以自由地阻塞或使用慢速文件系统)。

  • 可移植:完全用纯 Python 编写。

  • 支持 FTPSRFC-4217)、IPv6RFC-2428)、Unicode 文件名(RFC-2640)、MLSD/MLST 命令(RFC-3659)。

  • 支持虚拟用户和虚拟文件系统。

  • 灵活的“授权者”系统,能够管理 UNIXWindows 上的“虚拟”和“真实”用户。

性能

尽管是用解释型语言编写的,但 pyftpdlib 的传输速率与用 C 编写的常见 UNIX FTP 服务器相当或更高。它通常具有更好的可扩展性(见 基准测试),因为它与 vsftpd 和 proftpd 使用多个进程来实现并发不同,pyftpdlib 只使用一个(见 C10K 问题)。

pyftpdlib 与 proftpd 1.3.4 的比较

基准类型

pyftpdlib

proftpd

加速

STOR(客户端 -> 服务器)

585.90 MB/sec

600.49 MB/sec

-0.02x

RETR(服务器 -> 客户端)

1652.72 MB/sec

1524.05 MB/sec

+0.08

300 个并发客户端(连接、登录)

0.19 秒

9.98 秒

+51x

STOR(1 个文件,300 个空闲客户端)

585.59 MB/sec

518.55 MB/sec

+0.1x

RETR(1 个文件,300 个空闲客户端)

1497.58 MB/sec

1478.19 MB/sec

0x

300 个并发客户端(RETR 10M 文件)

3.41 秒

3.60 秒

+0.05x

300 个并发客户端(STOR 10M 文件)

8.60 秒

11.56 秒

+0.3x

300 个并发客户端(QUIT)

0.03 秒

0.39 秒

+12x

pyftpdlib 与 vsftpd 2.3.5 的比较

基准类型

pyftpdlib

vsftpd

加速

STOR(客户端 -> 服务器)

585.90 MB/sec

611.73 MB/sec

-0.04x

RETR(服务器 -> 客户端)

1652.72 MB/sec

1512.92 MB/sec

+0.09

300 个并发客户端(连接、登录)

0.19 秒

20.39 秒

+106x

STOR(1 个文件,300 个空闲客户端)

585.59 MB/sec

610.23 MB/sec

-0.04x

RETR(1 个文件,300 个空闲客户端)

1497.58 MB/sec

1493.01 MB/sec

0x

300 个并发客户端(RETR 10M 文件)

3.41 秒

3.67 秒

+0.07x

300 个并发客户端(STOR 10M 文件)

8.60 秒

9.82 秒

+0.07x

300 个并发客户端(QUIT)

0.03 秒

0.01 秒

+0.14x

更多基准测试请见 此处

命令行使用

在端口 2121 上启动一个具有写权限的匿名用户的 FTP 服务器

$ python3 -m pyftpdlib --write
RuntimeWarning: write permissions assigned to anonymous user.
  self._check_permissions(username, perm)
[I 2024-06-23 13:49:35] concurrency model: async
[I 2024-06-23 13:49:35] masquerade (NAT) address: None
[I 2024-06-23 13:49:35] passive ports: None
[I 2024-06-23 13:49:35] >>> starting FTP server on 0.0.0.0:2121, pid=763634 <<<

API 使用

>>> from pyftpdlib.authorizers import DummyAuthorizer
>>> from pyftpdlib.handlers import FTPHandler
>>> from pyftpdlib.servers import FTPServer
>>>
>>> authorizer = DummyAuthorizer()
>>> authorizer.add_user("user", "12345", "/home/giampaolo", perm="elradfmwMT")
>>> authorizer.add_anonymous("/home/nobody")
>>>
>>> handler = FTPHandler
>>> handler.authorizer = authorizer
>>>
>>> server = FTPServer(("127.0.0.1", 21), handler)
>>> server.serve_forever()
[I 13-02-19 10:55:42] >>> starting FTP server on 127.0.0.1:21 <<<
[I 13-02-19 10:55:42] poller: <class 'pyftpdlib.ioloop.Epoll'>
[I 13-02-19 10:55:42] masquerade (NAT) address: None
[I 13-02-19 10:55:42] passive ports: None
[I 13-02-19 10:55:42] use sendfile(2): True
[I 13-02-19 10:55:45] 127.0.0.1:34178-[] FTP session opened (connect)
[I 13-02-19 10:55:48] 127.0.0.1:34178-[user] USER 'user' logged in.
[I 13-02-19 10:56:27] 127.0.0.1:34179-[user] RETR /home/giampaolo/.vimrc completed=1 bytes=1700 seconds=0.001
[I 13-02-19 10:56:39] 127.0.0.1:34179-[user] FTP session closed (disconnect).

其他代码示例

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

pyftpdlib-2.0.0.tar.gz (196.1 kB 查看哈希值)

上传时间 源代码

支持者