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:\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文件被上传到服务端

以上就是python一秒搭建FTP服务器的详细内容,更多关于python FTP服务器的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python 获取ftp服务器文件时间的方法

    这个问题在网上找了很长时间,也没有很好的解决方案,大多数都是用的 ftp.retrlines('LIST',处理函数) 来获得文件的时间但是格式是 所以很难做成时间戳,获取时间的目的不就是用来比较, 所以下面个大家来个可以获取时间然后转化成时间戳的方式 首先函数 直接获取ftp文件的时间 然后我的做法是,先将时间转化成列表,然后做成时间元组,再用函数转化成时间戳. L = list(ftp.sendcmd('MDTM ' + "/home/tarena/%s/%s" % (files_

  • Python实现的FTP通信客户端与服务器端功能示例

    本文实例讲述了Python实现的FTP通信客户端与服务器端功能.分享给大家供大家参考,具体如下: 一 代码 1.服务端代码 import socket import threading import os import struct #用户账号.密码.主目录 #也可以把这些信息存放到数据库中 users = {'zhangsan':{'pwd':'zhangsan1234', 'home':r'c:\python 3.5'}, 'lisi':{'pwd':'lisi567', 'home':'c

  • python实现FTP服务器服务的方法

    FTP服务的主动模式和被动模式 在开始之前,先聊一下FTP的主动模式和被动模式,两者的区别 , 用两张图来表示可能会更加清晰一些: 主动模式: 主动模式工作过程: 1. 客户端以随机非特权端口N,就是大于1024的端口,对server端21端口发起连接 2. 客户端开始监听 N+1端口: 3. 服务端会主动以20端口连接到客户端的N+1端口. 主动模式的优点: 服务端配置简单,利于服务器安全管理,服务器只需要开放21端口 主动模式的缺点: 如果客户端开启了防火墙,或客户端处于内网(NAT网关之后

  • python实现从ftp服务器下载文件

    代码之余,将代码过程重要的一些代码段备份一下,如下的代码内容是关于Python从ftp服务器下载文件的的代码,希望能对小伙伴有用途. #coding=utf-8 ''' ftp自动下载.自动上传脚本,可以递归目录操作 ''' from ftplib import FTP import os,sys,string,datetime,time import socket class MYFTP: def __init__(self, hostaddr, username, password, rem

  • 使用python实现快速搭建简易的FTP服务器

    上回说到,使用python搭建一个简易的web下载服务器,但是这个简易的服务器客户端不能够上传文件.这次来搭建一个简易的ftp服务器,来提供文件的下载和上传功能. 一.首先我们来安装提供服务的pyftpdlib模块 pip install pyftpdlib 二.然后通过python的-m选项将pyftpdlib模块简单的独立服务器运行起来.这时我们想要共享那个目录,只需在该目录下运行命令即可 python -m pyftpdlib -m 以模块的方式启动 验证: 到这里,一个简单的FTP服务器

  • Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例

    本文实例讲述了Python实现基于多线程.多用户的FTP服务器与客户端功能.分享给大家供大家参考,具体如下: 项目介绍: 1. 用户加密认证 2. 允许同时多用户登录 3. 每个用户有自己的家目录 ,且只能访问自己的家目录 4. 对用户进行磁盘配额,每个用户的可用空间不同 5. 允许用户在ftp server上随意切换目录 6. 允许用户查看当前目录下文件 7. 允许上传和下载文件,保证文件一致性 8. 文件传输过程中显示进度条 实现的原理: 服务器端启用端口监听,并对每一连接启用一个线程,对用

  • python一秒搭建FTP服务器

    一.了解FTP服务器 FTP(文件传输协议),运行在tcp洗衣上,使用两个端口,即数据端口和命令端口,也称之为控制端口.默认情况下,20是数据端口,21是控制端口. FTP有两种传输模式:主动模式和被动模式 (1) 主动模式:客户端首先从任意的非特殊端口n(大于1023的端口,也是客户端的命令端口)连接FTP服务器的命令端口(默认是21),向服务器发出命令 PORT n+1,告诉服务器自己使用n+1端口作为数据端口进行数据传输,然后在n+1端口监听.服务器收到PORT n+1后向客户端返回一个"

  • 1 行 Python 代码快速实现 FTP 服务器

    摘要: 当你想快速共享一个目录的时候,这是特别有用的,只需要1行代码即可实现. 当你想快速共享一个目录的时候,这是特别有用的,只需要1行代码即可实现. FTP 服务器,在此之前我都是使用Linux的vsftpd软件包来搭建FTP服务器的,现在发现了利用pyftpdlib可以更加简单的方法即可实现FTP服务器的功能. 环境要求 Python 2.7 Windows / Linux 环境搭建 一行代码实现FTP服务器 通过Python的-m选项作为一个简单的独立服务器来运行,当你想快速共享一个目录的

  • Linux下使用vsftp搭建FTP服务器(附参数说明)

    介绍 本章主要介绍在Linux中搭建FTP服务器的过程,需要掌握的要点是配置文件的合理配置. 知识点 在linux中使用的FTP是vsftp FTP可以有三种登入方式分别是: 匿名登录方式:不需要用户密码 本地用户登入:使用本地用户和密码登入 虚拟用户方式:也是使用用户和密码登入,但是该用户不是linux中创建的用户 安装FTP 使用YUM安装 yum -y install vsftpd 文件配置 安装完之后在/etc/vsftpd/路径下会存在三个配置文件. vsftpd.conf: 主配置文

  • 利用apache ftpserver搭建ftp服务器的方法步骤

    目录 操作环境: 一.usermanager采用文件形式管理xml示例如下 二.usermanager采用mysql数据库管理用户时,ftpd-mysql.xml示例如下 三.usermanager采用Sqlite数据库管理用户时,ftpd-sqlite.xml示例如下 四.解决ftpd.exe在64位windows系统启动失败的问题 五.python操作sqlite的ftp.db管理(增加删除)用户 操作环境: win2012r2 x64 datacenter Apache FtpServer

  • CentOS 7下安装配置proftpd搭建ftp服务器的详细教程

    proftpd全称:Professional FTP daemon,是针对Wu-FTP的弱项而开发的,除了改进的安全性,还具备许多Wu-FTP没有的特点,能以Stand-alone.xinetd模式运行等.ProFTP已经成为继Wu-FTP之后最为流行的FTP服务器软件,越来越多的站点选用它构筑安全高效的FTP站点,ProFTP配置方便,并有MySQL和Quota模块可供选择,利用它们的完美结合可以实现非系统账号的管理和用户磁盘的限制.<摘抄百度百科> 本章通过下载源码的方式安装,可以到官网下

  • 5分钟快速搭建FTP服务器的图文教程

    一.什么是FTP FTP(File Transfer Protocol)是TCP/IP网络上两台计算机传送文件的协议,使得主机间可以共享文件. 二.搭建前期准备 1.首先打开控制面板找到"程序"点击打开,如下图所示: 2.在打开的"程序"窗口中,找到"启用或关闭windows功能"点击打开,如下图所示: 3.在"windows功能"中找到"Internet Information Services",并选中

  • centos 搭建ftp服务器详解及简单介绍

    centos 搭建ftp服务器 1.安装vsftpd sudo yum install vsftpd 2.配置vsftpd.conf # Allow anonymous FTP? (Beware - allowed by default if you comment this out). anonymous_enable=NO # When SELinux is enforcing check for SE bool ftp_home_dir local_enable=YES write_ena

  • Linux中搭建FTP服务器的方法

    Linux是以后操作系统的趋势所在,目前的大部分国产操作系统,甚至于安卓系统都是与Linux离不开关系.其中,FTP作为其中共享手段存在已久,我们今天就来看看怎么搭建简单的FTP服务器吧. FTP 是文件传输协议(File Transfer Protocol)的缩写.顾名思义,FTP用于计算机之间通过网络进行文件传输.你可以通过FTP在计算机账户间进行文件传输,也可以在账户和桌面计算机之间传输文件,或者访问在线软件归档.但是,需要注意的是多数的FTP站点的使用率非常高,可能需要多次重连才能连接上

  • 阿里云基于CentOS用vsftpd搭建FTP服务器

    最近需要在一台阿里云的云服务器上搭建FTP服务器,在这篇博文中分享一下我们根据实际需求进行的一些配置. ftp软件用的是vsftpd. vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序.特点是小巧轻快,安全易用. vsftpd 的名字代表"very secure FTP daemon",安全是它的开发者 Chris Evans 考虑的首要问题之一.在这个 FTP 服务器设计开发的最开始的时候,高安全性就是一个目标. 准备工作 安装vsftpd yum install v

  • CentOS6.9中搭建FTP服务器的方法

    1 基本环境 2 ftp工作模式 2.1 ftp通道 ftp工作会启动两个通道: 控制通道,数据通道 在ftp协议中,控制连接均是由客户端发起的,而数据连接有两种模式:port模式(主动模式)和pasv(被动模式) 2.2 port模式 在客户端需要接收数据时,ftp_client(大于1024的随机端口)----port命令-----ftp_server(21)发送port命令,这个port命令包含了客户端是用什么端口来接收数据(大于1024的随机端口),在传送数据时,ftp_server将通

随机推荐