pyftpdlib代码实战
2016-05-04 11:30
218 查看
新建一个基本的ftp服务器
添加一个日志管理功能
level可以等于logging.INFO或者 logging.DEBUG,后者记录的更加详细
启用logging后,屏幕上不显示了,全都重定向到了自己设置的.log文件中
md5加密用户名密码,一定程度上防止攻击
多线程和多进程
带宽限制
添加ssl认证
自定义事件回调处理
from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import FTPHandler from pyftpdlib.servers import FTPServer def main(): authorizer = DummyAuthorizer() authorizer.add_user('user', '12345', '.', perm='elradfmwM') authorizer.add_anonymous(os.getcwd()) #此处添加一个匿名用户 handler = FTPHandler #初始化处理客户端命令的类 handler.authorizer = authorizer handler.banner = "pyftpdlib based ftpd ready." #客户端连接时返回的字符串 #handler.masquerade_address = '151.25.42.11' #如果你在NAT之后,就用这个指定被动连接的参数 #handler.passive_ports = range(60000, 65535) address = ('0.0.0.0', 2121) #设置服务器的监听地址和端口 server = FTPServer(address, handler) server.max_cons = 256 #给链接设置限制 server.max_cons_per_ip = 5 server.serve_forever() # 启动服务器 if __name__ == '__main__': main()
添加一个日志管理功能
level可以等于logging.INFO或者 logging.DEBUG,后者记录的更加详细
启用logging后,屏幕上不显示了,全都重定向到了自己设置的.log文件中
import logging from pyftpdlib.handlers import FTPHandler from pyftpdlib.servers import FTPServer from pyftpdlib.authorizers import DummyAuthorizer authorizer = DummyAuthorizer() authorizer.add_user('user', '12345', '.', perm='elradfmwM') handler = FTPHandler handler.authorizer = authorizer logging.basicConfig(filename='/var/log/pyftpd.log', level=logging.INFO) server = FTPServer(('', 2121), handler) server.serve_forever()
md5加密用户名密码,一定程度上防止攻击
import os import sys from hashlib import md5 from pyftpdlib.handlers import FTPHandler from pyftpdlib.servers import FTPServer from pyftpdlib.authorizers import DummyAuthorizer, AuthenticationFailed #继承类以后添加加密功能 class DummyMD5Authorizer(DummyAuthorizer): def validate_authentication(self, username, password, handler): if sys.version_info >= (3, 0): password = md5(password.encode('latin1')) hash = md5(password).hexdigest() try: if self.user_table[username]['pwd'] != hash: raise KeyError except KeyError: raise AuthenticationFailed def main(): # get a hash digest from a clear-text password hash = md5('12345').hexdigest() authorizer = DummyMD5Authorizer() authorizer.add_user('user', hash, os.getcwd(), perm='elradfmw') authorizer.add_anonymous(os.getcwd()) handler = FTPHandler handler.authorizer = authorizer server = FTPServer(('', 2121), handler) server.serve_forever() if __name__ == "__main__": main()
多线程和多进程
from pyftpdlib.handlers import FTPHandler from pyftpdlib.servers import ThreadedFTPServer # <- from pyftpdlib.authorizers import DummyAuthorizer def main(): authorizer = DummyAuthorizer() authorizer.add_user('user', '12345', '.') handler = FTPHandler handler.authorizer = authorizer server = ThreadedFTPServer(('', 2121), handler) server.serve_forever() if __name__ == "__main__": main()
from pyftpdlib.handlers import FTPHandler from pyftpdlib.servers import MultiprocessFTPServer # <- from pyftpdlib.authorizers import DummyAuthorizer def main(): authorizer = DummyAuthorizer() authorizer.add_user('user', '12345', '.') handler = FTPHandler handler.authorizer = authorizer server = MultiprocessFTPServer(('', 2121), handler) server.serve_forever() if __name__ == "__main__": main()
带宽限制
import os from pyftpdlib.handlers import FTPHandler, ThrottledDTPHandler from pyftpdlib.servers import FTPServer from pyftpdlib.authorizers import DummyAuthorizer def main(): authorizer = DummyAuthorizer() authorizer.add_user('user', '12345', os.getcwd(), perm='elradfmw') authorizer.add_anonymous(os.getcwd()) dtp_handler = ThrottledDTPHandler dtp_handler.read_limit = 30720 # 30 Kb/sec (30 * 1024) dtp_handler.write_limit = 30720 # 30 Kb/sec (30 * 1024) ftp_handler = FTPHandler ftp_handler.authorizer = authorizer # have the ftp handler use the alternative dtp handler class ftp_handler.dtp_handler = dtp_handler server = FTPServer(('', 2121), ftp_handler) server.serve_forever() if __name__ == '__main__': main()
添加ssl认证
""" An RFC-4217 asynchronous FTPS server supporting both SSL and TLS. Requires PyOpenSSL module (http://pypi.python.org/pypi/pyOpenSSL). """ from pyftpdlib.servers import FTPServer from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.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(('', 21), handler) server.serve_forever() if __name__ == '__main__': main()
自定义事件回调处理
from pyftpdlib.handlers import FTPHandler from pyftpdlib.servers import FTPServer from pyftpdlib.servers import DummyAuthorizer class MyHandler(FTPHandler): def on_connect(self): print "%s:%s connected" % (self.remote_ip, self.remote_port) def on_disconnect(self): # do something when client disconnects pass def on_login(self, username): # do something when user login pass def on_logout(self, username): # do something when user logs out pass def on_file_sent(self, file): # do something when a file has been sent pass def on_file_received(self, file): # do something when a file has been received pass def on_incomplete_file_sent(self, file): # do something when a file is partially sent pass def on_incomplete_file_received(self, file): # remove partially uploaded files import os os.remove(file) def main(): authorizer = DummyAuthorizer() authorizer.add_user('user', '12345', homedir='.', perm='elradfmw') authorizer.add_anonymous(homedir='.') handler = MyHandler handler.authorizer = authorizer server = FTPServer(('', 2121), handler) server.serve_forever() if __name__ == "__main__": main()
相关文章推荐
- java 利用JAX-RS快速开发RESTful 服务
- spring事务隔离级别
- Java核心技术(四) —— 继承(1)
- 【AS/400】如何查找到含指定字符串的代码文件
- java 调用webservice的各种方法总结
- 深入探究TimSort对归并排序算法的优化及Java实现
- 源代码管理工具-SVN
- myeclipse10合成svn
- python 迭代器(iterator)和生成器(constructor)
- java
- JAVA获取字符串或者文件的MD5值
- jsp3 javabean
- c++ 按地址 按引用
- Java正则表达式基础<一>
- Python 对 验证码的使用
- (好文转发)关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型
- java导入项目乱码
- Java -- ArrayList排序
- JDK,JRE,JVM区别与联系
- 从I/O流里面读取数据