Python实现FTP服务端和客户端的自动搭建

Python实现FTP服务端和客户端的自动搭建

FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。在开发网站的时候,通常利用FTP协议把网页或程序传到Web服务器上。此外,由于FTP传输效率非常高,在网络上传输大的文件时,一般也采用该协议。

默认情况下FTP协议使用TCP端口中的 20和21这两个端口,其中20用于传输数据,21用于传输控制信息。但是,是否使用20作为传输数据的端口与FTP使用的传输模式有关,如果采用主动模式,那么数据传输端口就是20;如果采用被动模式,则具体最终使用哪个端口要服务器端和客户端协商决定。

Python实现FTP服务端的搭建

# -*- coding: utf-8 -*-
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler,ThrottledDTPHandler
from pyftpdlib.servers import FTPServer
from pyftpdlib.log import LogFormatter
import logging
# 记录日志,默认情况下日志仅输出到屏幕(终端),这里既输出到屏幕又输出到文件,方便日志查看
logger = logging.getLogger()
logger.setLevel(logging.INFO)
ch = logging.StreamHandler()
fh = logging.FileHandler(filename='myftpserver.log', encoding='utf-8') # 默认的方式是追加到文件
ch.setFormatter(LogFormatter())
fh.setFormatter(LogFormatter())
logger.addHandler(ch)   # 将日志输出至屏幕
logger.addHandler(fh)   # 将日志输出至文件


# 实例化虚拟用户,这是FTP验证首要条件
authorizer = DummyAuthorizer()
# 添加用户权限和路径,括号内的参数是(用户名、密码、用户目录、权限),可以为不同的用户添加不同的目录和权限
# 读权限:
# e: 改变文件目录;l: 列出文件; r: 从服务器接收文件
# 写权限:
# a: 文件上传; d: 删除文件; f: 文件重命名; m: 创建文件; w: 写权限; 
# M: 文件传输模式(通过FTP设置文件权限)
authorizer.add_user("user", "12345", r"/tmp/ftp", perm="elradfmw")
# 添加匿名用户,只需要路径
authorizer.add_anonymous(r"/tmp/ftp")


# 初始化ftp句柄
handler = FTPHandler
handler.authorizer = authorizer

# 添加被动端口范围
handler.passive_ports = range(2000,2333)

# 下载上传速度设置
dtp_handler = ThrottledDTPHandler
dtp_handler.read_limit = 300 * 1024 # 300kb/s
dtp_handler.write_limit = 300 * 1024 # 300kb/s
handler.dtp_handler = dtp_handler

# 监听IP和端口,Linux里需要root用户才能使用21端口
server = FTPServer(("0.0.0.0", 21), handler)

# 最大连接数
server.max_cons = 150
server.max_cons_per_ip = 15

# 开始服务,自带日志打印信息
server.serve_forever()

 

Python实现FTP客户端的搭建

# -*- coding: utf-8 -*-

from ftplib import FTP
# 登录FTP
ftp = FTP(host='192.168.32.129', user='user', passwd='12345')
# 设置编码方式,windows系统可选择gbk
ftp.encoding = 'utf-8'
# 切换目录
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('a.txt', 'rb'))
# 查看目录下的文件详情
for f in ftp.mlsd(path='/test'):
    print(f)
[root@localhost ~]# python3 ftpclient.py 
-rw-r--r--   1 root     root            0 Nov 04 10:38 b.txt
-rw-r--r--   1 root     root            0 Nov 04 10:38 c.txt
-rw-r--r--   1 root     root            0 Nov 04 10:19 ftpserver.py
-rw-r--r--   1 root     root            0 Nov 04 10:38 n.png
-rw-r--r--   1 root     root            0 Nov 04 10:18 node.txt
('node.txt', {'modify': '20191104101849', 'perm': 'radfw', 'size': '0', 'type': 'file', 'unique': '802g30ba98b'})
('ftpserver.py', {'modify': '20191104103839', 'perm': 'radfw', 'size': '0', 'type': 'file', 'unique': '802g30ba993'})
('b.txt', {'modify': '20191104103810', 'perm': 'radfw', 'size': '0', 'type': 'file', 'unique': '802g30ba994'})
('c.txt', {'modify': '20191104103813', 'perm': 'radfw', 'size': '0', 'type': 'file', 'unique': '802g30ba995'})
('n.png', {'modify': '20191104103819', 'perm': 'radfw', 'size': '0', 'type': 'file', 'unique': '802g30ba996'})

*自动化搭建脚本:

#!/bin/bash
# Author: WuYang
# Date: 2019-11-04
# Function: set up ftp server
echo -e "\e[1;32mStep1: Now Install Packages......\e[0m"
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel gcc make
echo -e "\e[1;32mStep2: Now Install Python3......\e[0m"
tar -xvzf ./Python-3.7.4.tgz
cd Python-3.7.4
./configure --prefix=/usr/local/python-3.7.4
make && make install
ln -s /usr/local/python-3.7.4 /usr/bin/python3
echo "PYTHON_PATH=/usr/bin/python3/bin" >> /etc/profile
echo "export PATH=$PATH:$PYTHON_PATH" >> /etc/profile
source /etc/profile
echo -e "\e[1;32mStep2: Now Checking Python model......\e[0m"
cd ..
/usr/bin/python3/bin/pip3 install -r ./pypip.txt
echo -e "\e[1;32mStep2: Now Starting FTP server......\e[0m"
mkdir /tmp/ftp
/usr/bin/python3/bin/python3 ./ftp.py

需要将Python-3.7.4.tgz,pypip.txt以及ftp.py三个文件放置在同一级目录下。Python-3.7.4.tgz可自行下载,ftp.py即上述python脚本,pypip.txt文件内容如下:

pyftpdlib==1.5.5

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章