这篇文章主要讲解了“如何用python搭建FTP服务器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用python搭建FTP服务器”吧!

一、了解FTP服务器

FTP(文件传输协议),运行在tcp协议上,使用两个端口,即数据端口和命令端口,也称之为控制端口。默认情况下,20是数据端口,21是控制端口。

FTP有两种传输模式:主动模式和被动模式

(1) 主动模式:客户端首先从任意的非特殊端口n(大于1023的端口,也是客户端的命令端口)连接FTP服务器的命令端口(默认是21),向服务器发出命令 PORT n+1,告诉服务器自己使用n+1端口作为数据端口进行数据传输,然后在n+1端口监听。服务器收到PORT n+1后向客户端返回一个“ACK”,然后服务器从它自己的数据端口(20)到 客户端先前指定的数据端口(n+1端口)的连接,最后客户端向服务器返回一个“ACK”。

(2)被动模式:为了解决服务器发起到客户端的连接问题,开发了被动FTP,或者叫做PASV,当客户端通知服务器处于被动模式时才启用。在被动模式下,命令连接和数据连接都是有客户端发起。当开启一个FTP连接时,客户端打开两个非特权的任意端口(大于1023)。第一个端口连接服务器的21端口,但是与主动方式不同,客户端不会提交PORT命令并允许服务器来回连接数据端口,而是提交PASV命令。这样做的结果就是服务器会开启任意一个非特权端口,并且发送PORT p命令给客户端,然后客户端发起从本地端口 n+1 到 服务器端口p 的连接来传输数据

总结:主动模式有利于对FTP服务器的管理,但是不利于对客户端的管理。因为FTP服务器企图和客户端的高位随机端口建立连接,而这个端口很有可能会被客户端的防火墙阻塞掉。被动模式相反。

二、利用python搭建FTP服务器

python搭建FTP需要利用到pyftpdlib模块

1.安装 pyftpdlib 模块

C:UsersLTP>pip3installpyftpdlibC:UsersLTP>python3-mpyftpdlib-p21

2.找到pyftpdlib模块源文件所在目录

C:UsersLTP>python3……>>>importpyftpdlib>>>pyftpdlib.__path__['/usr/local/python3/lib/python3.7/site-packages/pyftpdlib']

3.到 pyftpdlib目录下

发现 filesystems.py 和 handlers.py 两个文件,先执行备份

C:UsersLTP>dirE:PycharmProjectsuntitledproject01venvLibsite-packagespyftpdlib2021/05/1517:50<DIR>.2021/05/1517:50<DIR>..2017/12/3016:4435,246authorizers.py2021/05/1517:4924,798filesystems-副本.py2021/05/1517:4924,798filesystems.py2019/10/2416:26144,635handlers-副本.py2019/10/2416:26144,635handlers.py2017/12/3016:4436,769ioloop.py2019/10/2416:265,823log.py2019/10/2416:263,844prefork.py2019/10/2416:2621,658servers.py2021/05/1517:45<DIR>test2019/10/2416:26774_compat.py2019/10/2416:282,845__init__.py2018/04/2618:414,879__main__.py2021/05/1517:46<DIR>__pycache__12个文件450,704字节4个目录44,605,644,800可用字节#备份filesystems.py和handlers.py#修改filesystems.py文件#将原本的"utf-8"修改成"gbk"(windows支持的gbk类型的bytes)503yieldline.encode('gbk',self.cmd_channel.unicode_errors#修改handlers.py文件#将原本的"utf-8"修改成"gbk"(windows支持的gbk类型的bytes)1413returnbytes.decode('gbk',self.unicode_errors)

4. 编写并运行FTP代码

#该脚本程序是运行在windows上的ftp,运行前需要安装pyftpdlib模块,pip3installpyftpdlib#修改filesystems.py文件,将503行的"utf-8"修改成"gbk"(windows支持的gbk类型的bytes)即yieldline.encode('gbk',self.cmd_channel.unicode_errors#修改handlers.py文件,将1413行的"utf-8"修改成"gbk"(windows支持的gbk类型的bytes)即returnbytes.decode('gbk',self.unicode_errors)frompyftpdlib.authorizersimportDummyAuthorizerfrompyftpdlib.handlersimportFTPHandler,ThrottledDTPHandlerfrompyftpdlib.serversimportFTPServerfrompyftpdlib.logimportLogFormatterimportlogging#1.记录日志输出到文件和终端logger=logging.getLogger('FTP-LOG')logger.setLevel(logging.DEBUG)cs=logging.StreamHandler()cs.setLevel(logging.INFO)fs=logging.FileHandler(filename='test.log',mode='a',encoding='utf-8')fs.setLevel(logging.DEBUG)formatter=logging.Formatter('[%(asctime)s]%(name)s-%(levelname)s:%(message)s')cs.setFormatter(formatter)fs.setFormatter(formatter)logger.addHandler(cs)logger.addHandler(fs)#2.实例化虚拟用户,这是FTP的首要条件authorizer=DummyAuthorizer()#3.添加用户权限和路径,括号内的参数是(用户名、密码、用户目录、权限),可以为不同的用户添加不同的目录和权限authorizer.add_user('user','123456',"d:/",perm="elradfmw")#4.添加匿名用户,只需要路径authorizer.add_anonymous("d:/")#5.初始化ftp句柄handler=FTPHandlerhandler.authorizer=authorizer#6.添加被动端口范围handler.passive_ports=range(2000,20033)#7.上传下载的速度设置dtp_handler=ThrottledDTPHandlerdtp_handler.read_limit=300*1024#300kb/sdtp_handler.write_limit=300*1024#300kb/shandler.dtp_handler=dtp_handler#8.监听ip和端口,linux里需要root用户才能使用21端口server=FTPServer(('0.0.0.0',21),handler)#9.最大连接数server.max_cons=150server.max_cons_per_ip=15#10.开始服务,自带打印日志信息server.serve_forever()

authorizer.add_user(‘user', ‘123456', “d:/”, perm=“elradfmw”)中perm权限参数的含义:
1、读权限:

e :改变文件目录
l :列出文件
r :从服务器接收文件
2、写权限

a :文件上传
d :删除文件
f :文件重命名
m :创建文件
w :写权限
M:文件传输模式(通过FTP设置文件权限)
5.使用CMD登入FTP验证
使用正常,认证正常

三、编写FTP客户端程序

可以用于文件的上传下载

[root@localhostpython]#vimftp.py#!/bin/envpython3#-*-coding:utf-8-*-#Time:2021-5-1521:08#Description:FTPCLIENT#FileName:ftp.py#FTP客户端fromftplibimportFTP#1.登入ftpftp=FTP(host='192.168.0.108',user='user',passwd='123456')#设置编码方式,由于在windows系统,设置编码方式为gbk'ftp.encoding='gbk'#切换目录ftp.cwd('test')#列出文件夹内容ftp.retrlines('LIST')#或者ftp.dir()#下载文件node.txtftp.retrbinary('RETRnode.txt',open('node.txt','wb').write)#上传文件ftpserver.pyftp.storbinary('STORftpserver.py',open('ftpserver.py','rb'))#查看目录下文件详情forfileinftp.mlsd(path='/test'):print(file)

执行结果:

[root@localhost python]# ./ftp.py
# 列出了test文件夹中的内容
-rw-rw-rw- 1 owner group 1661 May 15 14:19 ftpserver.py
-rw-rw-rw- 1 owner group 12 May 15 14:14 node.txt
# 查看到了目录下文件的详情
('ftpserver.py', {'modify': '20210515142003', 'perm': 'radfw', 'size': '1661', 'type': 'file'})
('node.txt', {'modify': '20210515141442', 'perm': 'radfw', 'size': '12', 'type': 'file'})
[root@localhost python]# ls # node.txt文件被下载到客户端
ftp.py ftpserver.py node.txt

到windows的test目录下验证

ftpserver.py文件被上传到服务端

感谢各位的阅读,以上就是“如何用python搭建FTP服务器”的内容了,经过本文的学习后,相信大家对如何用python搭建FTP服务器这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!