Search code examples
pythonwindowspyftpdlib

pyftpdlib runs but doesn't seem to be listening on port yet other ftp server apps work


I'm trying to build an ftp server running in Python on Windows. I took the basic example for pyftpdlib, as you see below.

import os
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer

def main():
    # Instantiate a dummy authorizer for managing 'virtual' users
    authorizer = DummyAuthorizer()

    # Define a new user having full r/w permissions and a read-only
    # anonymous user
    authorizer.add_user('user', '12345', "c:\\temp", perm='elradfmwM')
    authorizer.add_anonymous(os.getcwd())

    # Instantiate FTP handler class
    handler = FTPHandler
    handler.authorizer = authorizer

    # Define a customized banner (string returned when client connects)
    handler.banner = "pyftpdlib based ftpd ready."

    # Specify a masquerade address and the range of ports to use for
    # passive connections.  Decomment in case you're behind a NAT.
    #handler.masquerade_address = '151.25.42.11'
    #handler.passive_ports = range(60000, 65535)

    # Instantiate FTP server class and listen on 0.0.0.0:2121
    address = ('', 21)
    server = FTPServer(address, handler)

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

    # start ftp server
    server.serve_forever()

if __name__ == '__main__':
    main()

When it runs/executes it seems to be waiting, nothing else is using port 21. See output below from its process.

[I 2017-04-17 19:05:55] >>> starting FTP server on :::21, pid=43124 <<<
[I 2017-04-17 19:05:55] concurrency model: async
[I 2017-04-17 19:05:55] masquerade (NAT) address: None
[I 2017-04-17 19:05:55] passive ports: None

But from a remote windows host I cannot telnet to port 21 on the host where pyftpdlib script is running. I have another separate standalone ftp server .exe for windows running and it works fine I can telnet from the remote windows host to port 21 on the host I can't get pyftpdlib to run properly on it, so I know it's not any FW or network issues.

I'm really scratching my head on why this module pyftpdlib won't work.


Solution

  • Maybe it's because it's listening on an IPv6 address. Try to change this:

    address = ('', 21)
    

    to this:

    address = ('0.0.0.0', 21)