pyftpdlib,用python脚本搭建ftp服务器

2020年7月19日 / 16次阅读 / 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用户的权限控制:

  • 首先在authorizer.add_user里面设置基本权限;
  • 然后对子目录,如果有不同的权限需求,使用override_perm函数调整(https://pyftpdlib.readthedocs.io/en/latest/api.html#pyftpdlib.authorizers.DummyAuthorizer);

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条留言

电子邮件地址不会被公开。 必填项已用*标注

  • 麦新杰

    别忘了放行云端服务器使用到的端口 [回复]

  • 麦新杰

    用DummyAuthorizer,设置的ftp用户与底层系统无关。 [回复]


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top