PyFtpdLib 如何在运行服务器时添加用户
我正在用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'))
现在你只需要决定怎么调用线程来添加用户。
注意:我尝试使用更新的线程模块,但没有得到什么实质性的结果。不过这个选项对我来说效果很好。