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 в режиме демона. Посмотрите здесь для примера

Другие вопросы по тегам