非常快速的异步FTP服务器库
项目描述
快速链接
关于
Python FTP 服务器库提供了一个高级可移植接口,可以轻松编写非常高效、可扩展和异步的 FTP 服务器。它是 Python 编程语言中最完整、符合 RFC-959 的 FTP 服务器实现。
特性
性能
尽管是用解释型语言编写的,但 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 成为其现在这样,投入了大量的时间和精力。如果您觉得 pyftpdlib 对您或您的业务有用,并想支持其未来的发展,请考虑 捐赠 一些钱。
项目详情
pyftpdlib-2.0.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1aded131fc7d41b0fa734c7879a96a6251366b141e8886782bcb1de616ffc791 |
|
MD5 | 36d7328c7dde493816bc3677b3c71287 |
|
BLAKE2b-256 | f169a524dcb5a9be722273a74d71c509f3d875238c54fd7426fab6fd05ca8521 |