【问题标题】:PyFtpdLib How to add a user while still running serverPyFtpdLib 如何在仍在运行服务器的同时添加用户
【发布时间】:2014-06-26 17:00:14
【问题描述】:

我正在 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 服务器,只要我可以控制一切。

我将从数据库中添加大量用户,然后删除它们。所以我不想每次需要添加某人时都关闭服务器并重新启动它。

【问题讨论】:

    标签: python ftp pyftpdlib


    【解决方案1】:

    如果有人对此主题感兴趣,我想我已经找到了解决方案。

    我所做的是将上面的代码保存在一个名为“create_ftp_server.py”的文件中,并将“main”从一个 def 更改为一个类。

    #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'))
    

    您现在要做的就是决定如何调用线程来添加用户。

    注意:我尝试使用较新的 Threading 模块,但无法获得任何实际结果。不过,这个选项对我来说效果很好。

    【讨论】:

    • 是否有一个示例如何使用 pyftpd lib 现在开箱即用支持的多线程模式运行它?
    【解决方案2】:

    你可以这样做,使用这样的 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))
    

    并从

    更改句柄线
    self.handler = FTPHandler
    

    self.handler = siteadd
    

    检查这是否有效。

    连接到您的 FTP 并运行 SITE HELP 命令,您会看到所有可用的命令。

    您也可以在守护程序模式下运行 FTPd。以here 为例

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-27
      • 2023-01-28
      • 1970-01-01
      • 2021-08-14
      • 2021-10-02
      相关资源
      最近更新 更多