Python FTP服务器:我如何支持安全和不安全

时间:2016-03-21 00:07:08

标签: python ftp pyftpdlib

我可以使用文档中的示例创建一个响应端口21(或在此示例中为2121)的基本FTP服务器:

from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
from pyftpdlib.contrib.authorizers import WindowsAuthorizer

def main():
    authorizer = WindowsAuthorizer()
    # Use Guest user with empty password to handle anonymous sessions.
    # Guest user must be enabled first, empty password set and profile
    # directory specified.
    #authorizer = WindowsAuthorizer(anonymous_user="Guest", anonymous_password="")
    handler = FTPHandler
    handler.authorizer = authorizer
    server = FTPServer(('', 2121), handler)
    server.serve_forever()

if __name__ == "__main__":
    main()

或者我可以创建一个支持TLS(同样这是来自文档的示例,除了我们的安全FTP端口是990,而不是original code sample中显示的21):

from pyftpdlib.servers import FTPServer
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.contrib.handlers import TLS_FTPHandler


def main():
    authorizer = DummyAuthorizer()
    authorizer.add_user('user', '12345', '.', perm='elradfmw')
    authorizer.add_anonymous('.')
    handler = TLS_FTPHandler
    handler.certfile = 'keycert.pem'
    handler.authorizer = authorizer
    # requires SSL for both control and data channel
    #handler.tls_control_required = True
    #handler.tls_data_required = True
    server = FTPServer(('', 990), handler)
    server.serve_forever()

if __name__ == '__main__':
    main()

有没有办法让他们在同一个脚本中回答端口21(不安全)和990(用TLS保护),它们共享一系列被动端口,例如:

handler.passive_ports = range(50000, 50051)

我想我可以编写两个脚本,但如果它们共享被动端口范围,它将如何工作?该范围是一个要求,我们使用的当前IIS设置支持TLS和不安全的连接。我想在自定义服务器中使用pyftpdlib,以便我们可以对上传的文件执行自定义逻辑。一切正常,我只需要了解最后一点,而且我没有编写FTP服务器的经验。

1 个答案:

答案 0 :(得分:1)

在同一个流程中不需要同时使用这两种服务器,但您只需使用具有相同passive_ports设置的单独流程即可。创建套接字时,它只会尝试使用给定范围内的端口,该端口未被系统上的任何其他进程使用。因此,如果特定的一个端口已被其他服务器进程使用,则一个服务器进程将仅使用另一个端口重试。