python一秒搭建FTP服务器
作者:知无涯学无尽 发布时间:2021-03-04 01:44:30
一、了解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:\Users\LTP> pip3 install pyftpdlib
C:\Users\LTP> python3 -m pyftpdlib -p 21
2.找到pyftpdlib模块源文件所在目录
C:\Users\LTP> python3
……
>>> import pyftpdlib
>>> pyftpdlib.__path__
['/usr/local/python3/lib/python3.7/site-packages/pyftpdlib']
3.到 pyftpdlib目录下
发现 filesystems.py 和 handlers.py 两个文件,先执行备份
C:\Users\LTP> dir E:\PycharmProjects\untitled\project01\venv\Lib\site-packages\pyftpdlib
2021/05/15 17:50 <DIR> .
2021/05/15 17:50 <DIR> ..
2017/12/30 16:44 35,246 authorizers.py
2021/05/15 17:49 24,798 filesystems - 副本.py
2021/05/15 17:49 24,798 filesystems.py
2019/10/24 16:26 144,635 handlers - 副本.py
2019/10/24 16:26 144,635 handlers.py
2017/12/30 16:44 36,769 ioloop.py
2019/10/24 16:26 5,823 log.py
2019/10/24 16:26 3,844 prefork.py
2019/10/24 16:26 21,658 servers.py
2021/05/15 17:45 <DIR> test
2019/10/24 16:26 774 _compat.py
2019/10/24 16:28 2,845 __init__.py
2018/04/26 18:41 4,879 __main__.py
2021/05/15 17:46 <DIR> __pycache__
12 个文件 450,704 字节
4 个目录 44,605,644,800 可用字节
# 备份 filesystems.py 和 handlers.py
# 修改filesystems.py文件
# 将原本的"utf-8"修改成"gbk"(windows支持的gbk类型的bytes)
503 yield line.encode('gbk', self.cmd_channel.unicode_errors
# 修改 handlers.py 文件
# 将原本的"utf-8"修改成"gbk"(windows支持的gbk类型的bytes)
1413 return bytes.decode('gbk', self.unicode_errors)
4. 编写并运行FTP代码
# 该脚本程序是运行在windows上的ftp,运行前需要安装pyftpdlib模块, pip3 install pyftpdlib
# 修改filesystems.py文件,将503 行的 "utf-8"修改成"gbk"(windows支持的gbk类型的bytes)即 yield line.encode('gbk', self.cmd_channel.unicode_errors
# 修改 handlers.py 文件,将1413行的"utf-8"修改成"gbk"(windows支持的gbk类型的bytes)即 return bytes.decode('gbk', self.unicode_errors)
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler,ThrottledDTPHandler
from pyftpdlib.servers import FTPServer
from pyftpdlib.log import LogFormatter
import logging
# 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 = FTPHandler
handler.authorizer = authorizer
# 6.添加被动端口范围
handler.passive_ports = range(2000,20033)
# 7.上传下载的速度设置
dtp_handler = ThrottledDTPHandler
dtp_handler.read_limit = 300 * 1024 # 300 kb/s
dtp_handler.write_limit = 300 * 1024 # 300 kb/s
handler.dtp_handler = dtp_handler
# 8.监听ip和端口 , linux里需要root用户才能使用21端口
server = FTPServer(('0.0.0.0', 21), handler)
# 9.最大连接数
server.max_cons = 150
server.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@localhost python]# vim ftp.py
#!/bin/env python3
# -*- coding: utf-8 -*-
# Time: 2021-5-15 21:08
# Description: FTP CLIENT
# File Name: ftp.py
# FTP客户端
from ftplib import FTP
# 1.登入ftp
ftp = FTP(host='192.168.0.108', user='user', passwd='123456')
# 设置编码方式,由于在windows系统,设置编码方式为gbk'
ftp.encoding = 'gbk'
# 切换目录
ftp.cwd('test')
# 列出文件夹内容
ftp.retrlines('LIST') # 或者ftp.dir()
# 下载文件 node.txt
ftp.retrbinary('RETR node.txt', open('node.txt', 'wb').write)
# 上传文件ftpserver.py
ftp.storbinary('STOR ftpserver.py', open('ftpserver.py', 'rb'))
# 查看目录下文件详情
for file in ftp.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文件被上传到服务端
来源:https://blog.csdn.net/CN_LiTianpeng/article/details/116855645
猜你喜欢
- 如何在PYTHON里运用私有属性和方法class File:def __init__(self, name):self.name = nam
- 打印在使用go写一些小程序时,我们没必要引入额外的包,直接使用fmt标准包打印即可:import "fmt"func m
- 大家好哈,上一节我们研究了一下爬虫的异常处理问题,那么接下来我们一起来看一下Cookie的使用。为什么要使用Cookie呢?Cookie,指
- #!/bin/sh#code by scpman#功能:检查并修复mysql数据库表#将此脚本加到定时中,脚本执行时,等会读库,列出要修复的
- 本次小编向大家介绍的是根据用户的需求输入想爬取的内容及页数。主要步骤:1.提示用户输入爬取的内容及页码。2.根据用户输入,获取网址列表。3.
- 大家在使用PyCharm的过程中,肯定会遇到各种各样的问题,其中一个问题就是很多第三方的包安装不了。在使用过程中,我对这种情况进行了总结,现
- 原因大致是主键必须是唯一的,也就是数据库里可能存在和现还原数据库有重复的地方,a restriction that Foreign Keys
- 1、表的主键、外键必须有索引;2、数据量超过300的表应该有索引;3、经常与其他表进行连接的表,在连接字段上应该建立索引;4、经常出现在Wh
- 前言最近助教改作业导出的成绩表格跟老师给的名单顺序不一致,脑壳一亮就用pandas写了个脚本自动吧原始导出的成绩誊写到老师给的名单中了哈哈哈
- 概要:Oracle关系数据库系统以其卓越的性能获得了广泛的应用,而保证数据库的安全性 是数据库管理工作的重要内容。本文是笔者在总结Oracl
- 浅谈NumPy中的维度AxisNumPy中的维度是一个很重要的概念,很多函数的参数都需要给定维度Axis,如何直观的理解维度呢?我们首先以二
- //by zdzhuo <html> <head> <script type=
- 例如:文本abcaBcabCaBCabcaBCa,关键字bc,在不区分大小写的情况,一共有6个匹配项。 则在网页中显示的是abcaBcabC
- 本节内容0、列表常用功能汇总1、定义列表2、访问列表中的元素3、切片4、追加5、插入6、修改7、拷贝8、删除9、扩展10、统计11、翻转12
- 1. LEFT OUTER JOIN:左外关联 SELECT e.last_name, e.department_id, d.departm
- 前言数据清洗是一项复杂且繁琐(kubi)的工作,同时也是整个数据分析过程中最为重要的环节。有人说一个分析项目80%的时间都是在清洗数据,这听
- PowerDesigner简介 工具的用途 :这里我只介绍他在SqlServer数据库的应用,其它的我也不懂。工具的好处 : 个人
- 思路:先随机排序然后再分组就好了。1、创建表:CREATE TABLE `xdx_test` ( `id` int(11) NOT NULL
- 前言如果你在寻找python工作,那你的面试可能会涉及Python相关的问题。通过对网络资料的收集整理,本文列出了100道python的面试
- Anaconda 是一个旗舰版的python安装包, 因为普通的python没有库, 如果需要安装一些重要的库, 要经常一个一个下载,会非常