from twisted.protocols import ftp
from twisted.cred import portal,checkers
from zope.interface import implements
from twisted.python import filepath
# 关于的FTPRealm类的具体信息,请去C:\Python25\Lib\site-packages\twisted\cred\protal.py文件中寻找
class MyFTPRealm:
implements(portal.IRealm)
def __init__(self, anonymousRoot):
self.anonymousRoot = filepath.FilePath(anonymousRoot)
self.dir = {'lilei':'D:\\xls','username':'D:\\word-process'}
def requestAvatar(self, avatarId, mind, *interfaces):
for iface in interfaces:
if iface is ftp.IFTPShell:
if avatarId is checkers.ANONYMOUS:
avatar = ftp.FTPAnonymousShell(self.anonymousRoot)
else:
user_dir = self.dir[avatarId]
avatar = ftp.FTPShell(filepath.FilePath(user_dir))
return ftp.IFTPShell, avatar, \
getattr(avatar, 'logout', lambda: None)
raise NotImplementedError(\
"Only IFTPShell interface is supported by this realm")
# 这个./表示本地路径,是匿名用户的默认文件夹
# 关于的Portal类的具体信息,请去C:\Python25\Lib\site-packages\twisted\cred\protal.py 文件中寻找
p = portal.Portal(MyFTPRealm('./'))
p.registerChecker(checkers.AllowAnonymousAccess())
# user.db文件是所有非匿名用户的用户名和密码,格式如下
# lilei:password
# username:hanmeimei
p.registerChecker(checkers.FilePasswordDB("user.db"))
f = ftp.FTPFactory(p)
from twisted.internet import reactor
reactor.listenTCP(21, f)
reactor.run()
|