PyFtpdLib Как добавить пользователя при работающем сервере
Я запускаю скрипт для FTP-сервера в 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-сервера, если это необходимо, при условии, что я могу контролировать все.
Я собираюсь много добавлять пользователей из базы данных, а затем удалять их. Поэтому я не хочу отключать сервер и перезапускать его каждый раз, когда мне нужно добавить кого-то.
2 ответа
Если кто-то заинтересовался этой темой, думаю, я нашел решение.
Я сохранил приведенный выше код в файле с именем "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, но я не смог получить никаких реальных результатов с этим. Этот вариант будет хорошо работать для меня, хотя.
Вы можете сделать это с помощью команды 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 в режиме демона. Посмотрите здесь для примера