我在Python中使用PyFTPdLib运行一个脚本,如下所示:
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服务器,只要我能控制一切。
我将从数据库中大量添加用户,然后删除它们。因此,我不想每次需要添加某个人时,都要关闭服务器并重新启动它。
发布于 2014-06-29 20:49:09
如果有人对这个话题感兴趣,我想我找到了一个解决办法。
我所做的是将上述代码保存在一个名为"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'))现在要做的就是决定如何调用线程来添加用户。
注意:我尝试使用较新的线程模块,但无法获得任何实际结果。不过,这个选项对我来说会很好。
发布于 2016-11-23 17:34:07
您可以这样做,通过这样的站点命令:
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并运行站点帮助命令,您可以看到所有可用的命令。
您也可以在守护进程模式下运行FTPd。查看这里以获得一个示例
https://stackoverflow.com/questions/24436287
复制相似问题