
рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рдкрд░ рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рдХрдИ рддреИрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд рдПрдлрд╝рдЯреАрдкреА рд╕рд░реНрд╡рд░ рд╣реИрдВред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рдПрдлрд╝рдЯреАрдкреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд░реНрд╡рд░ рдкрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдПрдлрд╝рдЯреАрдкреА рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреЛрд░реНрдЯ рдкрд░ рдЙрдард╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдлрд╝реЛрд▓реНрдбрд░реНрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдпрд╣ рдкреВрдЫрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдкрд╛рдпрдерди рдЯреВрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЦреЛрдЬ рдиреЗ рдЬрд▓реНрдж рд╣реА pyFTPd рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓реМрдЯрд╛ рджреАред
рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рддреИрдпрд╛рд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рджреЛ рдорд┐рдирдЯ рдореЗрдВ рдЕрдкрдиреЗ рдПрдлрд╝рдЯреАрдкреА рд╕рд░реНрд╡рд░ рдХреЛ рдХреИрд╕реЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдПред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдкрде рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдиреЗ рдФрд░ рдЗрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдФрд░ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдЙрдкрд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдПрдлрд╝рдЯреАрдкреА рд╕рд░реНрд╡рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ :)
рдбреЗрдЯрд╛рдмреЗрд╕
рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдЬрдЯрд┐рд▓ рд╕реЗ рдкрд░реЗ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред
рдПрд╕рдХреНрдпреВрдПрд▓:
CREATE TABLE ` users ` (
` id ` int ( 11 ) NOT NULL auto_increment,
` username ` varchar ( 255 ) NOT NULL ,
` password ` varchar ( 32 ) NOT NULL ,
` path ` varchar ( 255 ) NOT NULL ,
` perm ` varchar ( 8 ) default NULL ,
PRIMARY KEY ( ` id ` ),
KEY ` username ` ( ` username ` )
)
рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореБрдЦреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЙрдЧрд┐рди, рдкрд╛рд╕рд╡рд░реНрдб, рдПрдХреНрд╕реЗрд╕ рдЕрдзрд┐рдХрд╛рд░ рдФрд░ рдлрд╝реЛрд▓реНрдбрд░ рдХрд╛ рдкрде рд╣реИ рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд╣реБрдВрдЪ рд╣реЛрдЧреАред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рддреБрд░рдВрдд рдХреА рдЧрдИ рдереА рд╡рд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╡рд░реНрдЧ рдЖрд╡рд░рдг рдерд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛, рдЖрдк MySQL рдХреЛ рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
class DB :
init = None
db = None
def __init__ ( self ,init_db):
""" Constructor """
self . init = init_db
self . db = self . init()
def doSql ( self ,sql):
""" Handle SQL """
try :
self . db . execute(sql)
except :
try :
self . db = self . init()
self . db . execute(sql)
except :
print "error:" + sql
def getDB ( self ):
""" """
return self . db
def getLastId ( self ):
"""Get last insert ID"""
sql = "select LAST_INSERT_ID() as `id`"
self . doSql(sql)
data = self . db . fetchone()
if 'id' in data:
return data[ 'id' ]
else :
return None
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдФрд░ рд╕реНрд╡рдпрдВ рд╕рд░реНрд╡рд░ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рддрд░реАрдХреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХреА рдЧрдИ рдЬреЛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ рдФрд░ рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рд╕реНрдерд╛рди рдЪреБрдирдирд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИред
рд╕рд░реНрд╡рд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╡рд┐рдзрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
. . .
def starterver ( self ):
"""Run server"""
authorizer = self . ftpserver . DummyAuthorizer()
authorizer . validate_authentication = self . my_validate_authentication
authorizer . get_home_dir = self . my_get_home_dir
authorizer . get_perms = self . my_get_perms
authorizer . get_msg_login = self . my_get_msg_login
authorizer . get_msg_quit = self . my_get_msg_quit
authorizer . has_perm = self . my_has_perms
authorizer . has_user = self . my_has_user
# Instantiate FTP handler class
ftp_handler = ftpserver . FTPHandler
ftp_handler . authorizer = authorizer
ftp_handler . passive_ports = range ( 63000 , 63500 )
# Define a customized banner (string returned when client connects)
ftp_handler . banner = "pyftpdlib %s based ftpd ready." % ftpserver . __ver__
address = ( '127.0.0.1' , 23 )
ftpd = ftpserver . FTPServer(address, ftp_handler)
# set a limit for connections
ftpd . max_cons = 256
ftpd . max_cons_per_ip = 5
# start ftp server
ftpd . serve_forever()
. . .
рдореБрдЦреНрдп рд╡рд┐рдзрд┐рдпрд╛рдВ рдЬрд┐рдиреНрд╣реЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
validate_authentication - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ред
get_home_dir - рд╡рд╣ рд╣реЛрдо рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд╣реБрдВрдЪ рд╣реЛрдЧреАред
get_perms - рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдЕрдиреБрдорддрд┐рдпрд╛рдВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
has_perm - рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣реБрдБрдЪ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛
has_user - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
from db import DB
from config import init_db
class User :
def __init__ ( self ):
"""Init"""
def auth ( self ,username,password):
"""Make auth"""
sql = "select * from `users` where `username`=' %s ' and `password`=' %s '" % (username,password)
db = DB(init_db)
db . doSql(sql)
res = db . getDB() . fetchone()
if res:
return 1
else :
return None
def getPath ( self ,username):
"""Return path by username"""
sql = "select `path` from `users` where `username`=' %s '" % username
db = DB(init_db)
db . doSql(sql)
uparam = db . getDB() . fetchone()
if uparam:
return uparam[ 'path' ]
else :
return None
def getPerm ( self ,username):
"""Return permission by username"""
sql = "select `perm` from `users` where `username`=' %s '" % username
db = DB(init_db)
db . doSql(sql)
uparam = db . getDB() . fetchone()
if uparam:
return uparam[ 'perm' ]
else :
return ''
def hasUser ( self ,username):
"""Checj user into DB"""
sql = "select `id` from `users` where `username`=' %s '" % (username)
db = DB(init_db)
db . doSql(sql)
uparam = db . getDB() . fetchone()
if uparam:
return 1
else :
return 0
рд╣рдо рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЗ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ:
def my_validate_authentication ( self ,username,password):
return User() . auth(username, password)
def my_get_home_dir ( self ,username):
return User() . getPath(username)
def my_get_perms ( self ,username):
return User() . getPerm(username)
def my_get_msg_login ( self ,username):
return 'hello msg login'
def my_get_msg_quit ( self ,username):
return 'byu msg quit'
def my_has_user ( self ,username):
return User() . hasUser(username)
def my_has_perms ( self ,username, perm, path = None ):
return 1
рдкрд░рд┐рдгрд╛рдо
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
рдХреНрдпрд╛ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЙрд▓ рдХреЛ рдСрдлрд╝рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╢рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, memcacheред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:
- рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧрд┐рди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХреИрд╢ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рд▓рд┐рдЦреЗрдВ рдФрд░ рдлрд┐рд░ рдЙрд╕реЗ рд╡рд╣рд╛рдВ рд╕реЗ рдкрдврд╝реЗрдВ
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдХреИрд╢ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВ рдФрд░ рд╕рдордп-рд╕рдордп рдкрд░ рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ
рд╕реНрд░реЛрдд рдХреЛрдб
рд╕реЛрд░реНрд╕ рдХреЛрдб рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред
рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ
http://en.wikipedia.org/wiki/File_Transfer_Protocol
http://code.google.com/p/pyftpdlib/