首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何停止pyftpdlib FTP服务器?

如何停止pyftpdlib FTP服务器?
EN

Stack Overflow用户
提问于 2014-10-28 10:14:42
回答 3查看 3.1K关注 0票数 2

我刚刚开始使用pyftpdlib。我首先要做的是将示例服务器包装在一个线程中。但是如果我运行这个脚本,它就不会退出:

代码语言:javascript
复制
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
import logging

import threading

class FtpThread(threading.Thread):
  def __init__(self, user_list):
    self.user_list = user_list
    self.killswitch = 0
    threading.Thread.__init__(self)
  def run(self,*args,**kwargs):
    authorizer = DummyAuthorizer()
    authorizer.add_user('user', 'bla', '/home/user/git/verteilerCore2/default_basedir/in/1/', perm='elradfmwM')
    handler = FTPHandler
    handler.authorizer = authorizer

    logging.basicConfig(filename='/var/log/verteiler_ftp.log', level=logging.INFO)
    handler.banner = "pyftpdlib based ftpd ready."
    address = ('', 21)
    self.server = FTPServer(address, handler)
    self.server.max_cons = 256
    self.server.max_cons_per_ip = 5
    self.server.serve_forever()

  def stop(self):
    self.server.close_all()

def main():
  ftp_server = FtpThread("")
  ftp_server.start()
  import time
  time.sleep(1)
  ftp_server.stop()

if __name__ == '__main__':
    main()

我要怎么做才能让server_forever停下来?调用"close_all“会使服务器停止服务,但整个脚本不会退出:(

EN

回答 3

Stack Overflow用户

发布于 2019-02-08 22:54:35

我遇到了同样的问题(python 2.7.14,Ubuntu 16.04)。正如https://github.com/giampaolo/pyftpdlib/blob/master/pyftpdlib/test/test_servers.py中所建议的,我通过使用ThreadedFTPServer iso FTPServer使其正常工作。

代码语言:javascript
复制
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import ThreadedFTPServer

import threading

def __init__(self, addr):
    authorizer = DummyAuthorizer()
    authorizer.add_anonymous(os.getcwd())

    handler = FTPHandler
    handler.authorizer = authorizer
    handler.banner = "pyftpdlib based ftpd ready."

    ThreadedFTPServer.__init__(self, addr, handler)

    # set a limit for connections
    self.max_cons = 256
    self.max_cons_per_ip = 5

def _run_server(self):
    self.serve_forever()

def start(self):
    srv = threading.Thread(target=self._run_server)
    srv.deamon = True
    srv.start()

def stop(self):
    self.close_all()

-->本例中,调用"close_all“退出脚本

票数 2
EN

Stack Overflow用户

发布于 2014-10-28 17:54:42

在Windows8上试过了,它确实干净地退出了:

代码语言:javascript
复制
[I 14-10-28 11:49:18] >>> starting FTP server on :::21, pid=1892 <<<
[I 14-10-28 11:49:18] poller: <class 'pyftpdlib.ioloop.Select'>
[I 14-10-28 11:49:18] masquerade (NAT) address: None
[I 14-10-28 11:49:18] passive ports: None
[I 14-10-28 11:49:19] >>> shutting down FTP server (0 active fds) <<<

您能提供更多关于您的设置的详细信息吗?

票数 0
EN

Stack Overflow用户

发布于 2019-02-10 23:55:37

如果找到了这个解决方案。已在Windows 10和Linux (Windows 10 WSL)上测试。

代码语言:javascript
复制
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import ThreadedFTPServer
import os


class MyFTPHandler(FTPHandler):
    def on_file_received(self, file):
        if os.path.basename(file) == 'last_file':
            self.server.close_when_done()


def main():
    authorizer = DummyAuthorizer()
    authorizer.add_anonymous('/mnt/c/Temp/ftp' if os.name == 'posix' else r'C:\Temp\ftp', perm='w')

    handler = MyFTPHandler
    handler.authorizer = authorizer

    server = ThreadedFTPServer(('0.0.0.0', 21), handler)
    server.serve_forever()


if __name__ == '__main__':
    main()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26599859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档