PyFtpdLib 如何在运行服务器时添加用户

3 投票
2 回答
4260 浏览
提问于 2025-04-18 11:13

我正在用Python和PyFTPdLib运行一个FTP服务器的脚本,代码是这样的:

from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer

def main():
    authorizer = DummyAuthorizer()

    authorizer.add_user('user', '12345', '.', perm='elradfmwM')

    handler = FTPHandler
    handler.authorizer = authorizer

    address = ('localhost', 2121)
    server = FTPServer(address, handler)

    # start ftp server
    server.serve_forever()

if __name__ == '__main__':
    main()

每次我调用这段代码时,命令行就会一直忙着运行“server.serve_forever()”,而不会继续执行if循环里的内容。

所以我想问的是,如何在服务器运行时添加用户,而不需要关闭服务器呢?

我需要再创建一个脚本来调用这个脚本,然后再创建一个脚本来添加用户吗?这样做需要用到线程吗,这样两个脚本才能同时运行而不会互相干扰?

我试着查找这个模块的教程,但没有找到任何例子或解决方案。如果需要的话,我愿意换一个模块来运行FTP服务器,只要我能控制一切就行。

我会频繁地从数据库中添加和删除用户,所以我不想每次添加用户时都要关闭服务器并重启。

2 个回答

0

你可以使用 SITE 命令来做到这一点,方法如下:

proto_cmds = FTPHandler.proto_cmds.copy()
#Define SITE ADDUSER USERNAME PASSWORT HOME PRIVS
proto_cmds.update(
    {'SITE ADDUSER': dict(perm='m', auth=True, arg=True, help='Syntax: SITE <SP> ADDUSER USERNAME PASSWORT HOME PRIVS <SP>.')}
)

class siteadd(TLS_FTPHandler):
    proto_cmds = proto_cmds

    def ftp_SITE_ADDUSER(self,user,passwd,loc,privi):
        self.authorizer.add_user(str(user), str(passwd), str(loc), perm=str(privi))

然后把 handle 行从

self.handler = FTPHandler

改成

self.handler = siteadd

看看这样是否有效。

连接到你的 FTP,然后运行 SITE HELP 命令,你会看到所有可用的命令。

你也可以以守护进程模式运行 FTPd。想要了解更多示例,可以查看 这里

2

如果有人对这个话题感兴趣,我想我找到了一个解决办法。

我做的就是把上面的代码保存到一个叫“create_ftp_server.py”的文件里,并把“main”从一个函数改成了一个类。

#First .py module
class ftp_server:
   def __init__(self):
       self.authorizer = DummyAuthorizer()
       self.authorizer.add_user('admin', 'password', '.', perm='elradfmwM')

   def run(self):
       self.handler = FTPHandler
       self.handler.authorizer = self.authorizer
       self.address = ('localhost', 21)
       self.server = FTPServer(self.address, self.handler)
       logging.basicConfig(filename='pyftpd.log', level=logging.INFO)
       self.server.serve_forever()

   def add_user(self,user,passwd,loc,privi):
       self.authorizer.add_user(str(user), str(passwd), str(loc), perm=str(privi))

然后我又做了一个模块来调用和运行这个文件(其实这只是我个人的喜好,你也可以把它加到同一个模块里)。

#Second .py module
import thread
import create_ftp_server

this_ftp = create_ftp_server.ftp_server()

thread.start_new_thread(this_ftp.run,())
thread.start_new_thread(this_ftp.add_user,('user','password',".",'elradfmwM'))

现在你只需要决定怎么调用线程来添加用户。

注意:我尝试使用更新的线程模块,但没有得到什么实质性的结果。不过这个选项对我来说效果很好。

撰写回答