2020年7月19日 / 685次阅读 / Last Modified 2020年7月19日
pyftpdlib
一直知道pyftpdlib的大名,一行代码开启ftp server,但一直也没有机会使用,自己网站服务器都是用sftp登录(sftp和ftps是不一样的哦)。这次有了个机会,公司要在跑Win系统的服务器上搭一个FTP server。
我一开始尝试了FileZilla Server,这个软件也很有名,我也一直用FileZilla Client。但是遇到几个问题不好解决:(1)账户密码莫名其妙地就不对了,要删除账号重新设置,而且密码貌似还不能有字母;(2)FTPS启动不了,这是跟Win系统匹配的问题,网上有人说是因为少了一个补丁,我看这个补丁居然是2011年出的,还是算了吧,服务器上还要别的server在跑呢。。。
思来想去,就来试试pyftpdlib吧,还好我在这个Win系统里,已经预装了Python3.8。
使用pyftpdlib来搭建ftp server,不是简单的在一个软件的GUI界面上点点点,而是通过一个短小的python脚本来设置和控制,然后运行这个python脚本,达到启动ftp服务器的效果。
安装:pip install pyftpdlib
脚本框架:
import os
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
def main():
# Instantiate a dummy authorizer for managing 'virtual' users
authorizer = DummyAuthorizer()
# Define a new user having full r/w permissions and a read-only
# anonymous user
authorizer.add_user('user', '12345', '.', perm='elradfmwMT')
authorizer.add_anonymous(os.getcwd())
# Instantiate FTP handler class
handler = FTPHandler
handler.authorizer = authorizer
# Define a customized banner (string returned when client connects)
handler.banner = "pyftpdlib based ftpd ready."
# Specify a masquerade address and the range of ports to use for
# passive connections. Decomment in case you're behind a NAT.
handler.masquerade_address = '151.25.42.11'
handler.passive_ports = range(60000, 65535)
# Instantiate FTP server class and listen on 0.0.0.0:2121
address = ('0.0.0.0', 2121)
server = FTPServer(address, handler)
# set a limit for connections
server.max_cons = 256
server.max_cons_per_ip = 5
# start ftp server
server.serve_forever()
if __name__ == '__main__':
main()
这段代码就是pyftpdlib官方文档中的代码,而我自己的代码,填上了0.0.0.0这个地址(我测试发现如果不写0.0.0.0,客户端连接不上),打开了masquerade_address(服务器在NAT或防火墙内,这个地址就要填服务器的公网ip)和passive_ports,修改路劲,修改用户名和密码等等,就OK了。
pyftpdlib官方文档:https://pyftpdlib.readthedocs.io/en/latest/index.html
基本上你对ftp服务器想要的配置,pyftpdlib都能够提供。我还测试了限流功能(https://pyftpdlib.readthedocs.io/en/latest/tutorial.html#throttle-bandwidth),有效果,但是效果不是特别好,传输时一卡一卡的,不过真的限流了。这可能跟pyftpdlib的限流层面有关系。
ftp用户的权限控制:
pyftpdlib可以支持ftps,需要额外安装PyOpenSSL模块,我还没有测试过。如果能行,就可以完美的解决FileZilla server不能启动ftps的问题,也对系统没有造成任何其它影响。
如果你的需求很简单,ftp服务器也是临时需求,可以在命令行直接运行pyftpdlib模块,这就是大家说的,一行代码启动ftp server,具体请看:https://pyftpdlib.readthedocs.io/en/latest/tutorial.html#command-line-usage
最后的问题是将启动pyftpdlib的脚本以win系统service的方式,做开机自启动,这个下一篇博文来介绍。
-- EOF --
本文链接:https://www.pynote.net/archives/2279
《pyftpdlib,用python脚本搭建ftp服务器》有2条留言
前一篇:ArgumentParser的prog参数
后一篇:pyftpdlib的流控机制
Ctrl+D 收藏本页
©Copyright 麦新杰 Since 2019 Python笔记
别忘了放行云端服务器使用到的端口 [ ]
用DummyAuthorizer,设置的ftp用户与底层系统无关。 [ ]