ftpd.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import argparse
  2. import logging
  3. import os
  4. import os.path
  5. import sys
  6. from hashlib import md5
  7. import pyftpdlib.handlers
  8. from pyftpdlib.authorizers import AuthenticationFailed, DummyAuthorizer
  9. from pyftpdlib.handlers import FTPHandler
  10. from pyftpdlib.servers import MultiprocessFTPServer
  11. FTP_ROOT = '/ftp_root'
  12. pyftpdlib.handlers.PassiveDTP.timeout = None
  13. class DummyMD5Authorizer(DummyAuthorizer):
  14. def validate_authentication(self, username, password, handler):
  15. if sys.version_info >= (3, 0):
  16. password = md5(password.encode('latin1'))
  17. hash = md5(password).hexdigest()
  18. try:
  19. if self.user_table[username]['pwd'] != hash:
  20. raise KeyError
  21. except KeyError:
  22. raise AuthenticationFailed
  23. def run_ftpd(user, password, host, port, passive, anon):
  24. user_dir = os.path.join(FTP_ROOT, user)
  25. if not os.path.isdir(user_dir):
  26. os.mkdir(user_dir)
  27. hash = md5(b'{}'.format(password)).hexdigest()
  28. authorizer = DummyMD5Authorizer()
  29. authorizer.add_user(user, hash, user_dir, perm='elradfmwMT')
  30. if anon:
  31. authorizer.add_anonymous('/ftp_root/nobody')
  32. handler = FTPHandler
  33. handler.authorizer = authorizer
  34. handler.permit_foreign_addresses = True
  35. passive_ports = map(int, passive.split('-'))
  36. handler.passive_ports = range(passive_ports[0], passive_ports[1])
  37. logging.basicConfig(filename='/log/pyftpd.log', level=logging.INFO)
  38. server = MultiprocessFTPServer((host, port), handler)
  39. server.max_cons = 256
  40. server.max_cons_per_ip = 5
  41. server.serve_forever()
  42. def main():
  43. parser = argparse.ArgumentParser(
  44. formatter_class=argparse.ArgumentDefaultsHelpFormatter
  45. )
  46. parser.add_argument(
  47. '--user', default='dimabru',
  48. help='Username for FTP acess (user will be created)')
  49. parser.add_argument('--password', default='Dimabru001',
  50. help='Password for FTP user.')
  51. parser.add_argument('--host', default='0.0.0.0')
  52. parser.add_argument('--port', type=int, default=21)
  53. parser.add_argument('--passive', default='3000-3010',
  54. help='Range of passive ports')
  55. parser.add_argument('--anon', action='store_true',
  56. help='Allow anonymous access')
  57. args = parser.parse_args()
  58. run_ftpd(**vars(args))
  59. if __name__ == '__main__':
  60. main()