您的位置:首页 > 编程语言

pyftpdlib代码实战

2016-05-04 11:30 218 查看
新建一个基本的ftp服务器

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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: