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

 

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