不写代码,使用twistd实现ftp服务器
2013-12-26 00:00
585 查看
使用方法如下:
twistd ftp
这时启动的ftp服务器的HOME目录为/usr/local/ftp,匿名用户名为anonymous,密码为随便的一个邮箱地址,端口号为2121。
可以通过如下命令查看此服务器的其他参数:
twistd ftp –help
比较有用的就是–root,来指定登陆的根目录。还有就是–port指定端口号。
不过要注意的是,这个服务器仅用于调试,不要应用于产品环境,因为它并没有做安全性方面的工作。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""a very simple ftp server by twisted
"""
import sys, os
sys.path.append('../../..')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from twisted.protocols import ftp
from twisted.cred import portal, checkers, credentials, error as credError
from twisted.internet import reactor, defer
from zope.interface import implements
from twisted.python import filepath
from django.contrib.auth import authenticate
from django.contrib.auth.models import User
class UserChecker:
implements(checkers.ICredentialsChecker)
credentialInterfaces = (credentials.IUsernamePassword,)
def __init__(self):
"passwords: a dict-like object mapping usernames to passwords"
def requestAvatarId(self, credentials):
user = authenticate(username=credentials.username, password=credentials.password)
if user is not None:
if user.is_active:
return defer.succeed(credentials.username)
else:
return defer.fail(credError.UnauthorizedLogin("access denied"))
else:
return defer.fail(credError.UnauthorizedLogin("No such user"))
class MyFTPRealm:
implements(portal.IRealm)
def __init__(self, anonymousRoot):
self.anonymousRoot = filepath.FilePath(anonymousRoot)
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:
try:
user = User.objects.get(username=avatarId)
ftpdir = user.ftp.all()[0].ftpdir
except:
raise "没有该用户"
avatar = ftp.FTPShell(filepath.FilePath(ftpdir.encode("utf-8")))
return ftp.IFTPShell, avatar, getattr(avatar, "logout", lambda:None)
raise NotImplementedError("only IFTPShell interface is supported by this realm")
class MyFtpServer(ftp.FTP):
def __init__(self, *args, **kw):
super(ftp.FTP, self).__init__(*args, **kw)
def dataReceived(self, data):
self.transport.write(data)
if __name__ == "__main__":
p = portal.Portal(MyFTPRealm(""))
p.registerChecker(UserChecker())
factory = ftp.FTPFactory(MyFtpServer())
factory.portal = p
reactor.listenTCP(2121, factory)
reactor.run()
twistd ftp
这时启动的ftp服务器的HOME目录为/usr/local/ftp,匿名用户名为anonymous,密码为随便的一个邮箱地址,端口号为2121。
可以通过如下命令查看此服务器的其他参数:
twistd ftp –help
比较有用的就是–root,来指定登陆的根目录。还有就是–port指定端口号。
不过要注意的是,这个服务器仅用于调试,不要应用于产品环境,因为它并没有做安全性方面的工作。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""a very simple ftp server by twisted
"""
import sys, os
sys.path.append('../../..')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from twisted.protocols import ftp
from twisted.cred import portal, checkers, credentials, error as credError
from twisted.internet import reactor, defer
from zope.interface import implements
from twisted.python import filepath
from django.contrib.auth import authenticate
from django.contrib.auth.models import User
class UserChecker:
implements(checkers.ICredentialsChecker)
credentialInterfaces = (credentials.IUsernamePassword,)
def __init__(self):
"passwords: a dict-like object mapping usernames to passwords"
def requestAvatarId(self, credentials):
user = authenticate(username=credentials.username, password=credentials.password)
if user is not None:
if user.is_active:
return defer.succeed(credentials.username)
else:
return defer.fail(credError.UnauthorizedLogin("access denied"))
else:
return defer.fail(credError.UnauthorizedLogin("No such user"))
class MyFTPRealm:
implements(portal.IRealm)
def __init__(self, anonymousRoot):
self.anonymousRoot = filepath.FilePath(anonymousRoot)
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:
try:
user = User.objects.get(username=avatarId)
ftpdir = user.ftp.all()[0].ftpdir
except:
raise "没有该用户"
avatar = ftp.FTPShell(filepath.FilePath(ftpdir.encode("utf-8")))
return ftp.IFTPShell, avatar, getattr(avatar, "logout", lambda:None)
raise NotImplementedError("only IFTPShell interface is supported by this realm")
class MyFtpServer(ftp.FTP):
def __init__(self, *args, **kw):
super(ftp.FTP, self).__init__(*args, **kw)
def dataReceived(self, data):
self.transport.write(data)
if __name__ == "__main__":
p = portal.Portal(MyFTPRealm(""))
p.registerChecker(UserChecker())
factory = ftp.FTPFactory(MyFtpServer())
factory.portal = p
reactor.listenTCP(2121, factory)
reactor.run()
相关文章推荐
- 使用struts2实现上传下载功能(附代码)。类似于ftp服务器。不止局限于本机的上传下载,其他机器也可使用此功能,服务器似的功能
- 使用struts2实现上传下载功能(附代码)。类似于ftp服务器。不止局限于本机的上传下载,其他机器也可使用此功能,服务器似的功能
- Java实现FTP服务器功能实例代码
- Linux下使用Shell脚本实现ftp的自动上传下载的代码小结
- 使用git代替FTP部署代码到服务器的例子
- Android使用ApacheFtpServer实现Ftp服务器
- 使用Commons-net包实现ftp服务器的访问
- Java代码使用FTPClient实现ftp文件上传下载和删除的功能
- 1 行 Python 代码快速实现 FTP 服务器
- java代码实现从FTP服务器上拉取文件到本地
- 1行Python代码实现FTP服务器
- Linux下使用Shell脚本实现ftp的自动上传下载的代码小结 【转】
- Java代码实现FTP服务器上传文件与下载文件
- 使用git服务器实现生产环境应用服务器代码更新管理的方案
- 使用 .NET WinForm 开发所见即所得的 IDE 开发环境,实现不写代码直接生成应用程序
- 使用FTPClient连接文件服务器并做相应操作(代码)
- 在vs code中使用ftp-sync插件实现客户端与服务器端代码的同步
- 使用log4cplus实现的分目录存放日志服务器完整工程+关键客户端代码
- JAVA中使用FTPClient实现文件上传下载实例代码
- JAVA中使用FTPClient实现文件上传下载实例代码