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

时间:2014-06-26 17:00:15

标签: python ftp pyftpdlib

我使用PyFTPdLib在Python中运行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 :(得分: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模块,但我无法获得任何实际结果。不过,这个选项对我来说很有用。

答案 1 :(得分: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))

并从

更改句柄行
self.handler = FTPHandler

self.handler = siteadd

检查是否有效。

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

您也可以在守护进程模式下运行FTPd。查看here示例