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.
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)