python實現簡單FTP服務器


計划用python寫一個簡單的分布式調度系統,仔細分析了一下發現需要幾個子系統,包括連接zk的組件,按時間調度的模塊,存儲用戶的可執行文件的ftp服務等

今天先實現一個小目標,用python做一個FTP服務器,然后實現簡單的上傳下載功能。

ftp_server.py

import configparser

from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler, ThrottledDTPHandler
from pyftpdlib.servers import FTPServer

from ftp.setting import ENABLE_ANONYMOUS, ANONYMOUS_PATH, MAX_DOWNLOAD, MAX_UPLOAD, PASSIVE_PORTS, WELCOME_MSG, IP, \
    PORT, MAX_CONS, MAX_PER_IP

# 新建一個用戶組
authorizer = DummyAuthorizer()

# 從文件讀取用戶賬號密碼權限配置
config = configparser.ConfigParser()
config.read('user.ini')
user_list = config.sections()
for user in user_list:
    passwd = config[user]["password"]
    perm = config[user]["perm"]
    home_dir = config[user]["home"]
    # 將用戶名,密碼,指定目錄,權限 添加到里面
    authorizer.add_user(user, passwd, homedir=home_dir, perm=perm)

# 添加匿名用戶 只需要路徑
if ENABLE_ANONYMOUS == 'on':
    authorizer.add_anonymous(ANONYMOUS_PATH)

# 下載上傳速度設置
dtp_handler = ThrottledDTPHandler
dtp_handler.read_limit = MAX_DOWNLOAD
dtp_handler.write_limit = MAX_UPLOAD

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

# 添加被動端口范圍
handler.passive_ports = range(PASSIVE_PORTS[0], PASSIVE_PORTS[1])

# 歡迎信息
handler.banner = WELCOME_MSG

# 監聽ip 和 端口
server = FTPServer((IP, PORT), handler)

# 最大連接數
server.max_cons = MAX_CONS
server.max_cons_per_ip = MAX_PER_IP

# 開始服務
print('FTP開始服務 ', (IP, PORT))
server.serve_forever()

ftp_server.py用到了一些配置文件setting.py和user.ini

IP = '127.0.0.1'
PORT = '21'
# 上傳速度  100kb/s
MAX_UPLOAD = 100 * 1024
# 下載速度 100kb/s
MAX_DOWNLOAD = 100 * 1024
# 最大連接數
MAX_CONS = 100
# 最多IP數
MAX_PER_IP = 10
# 被動端口范圍,注意被動端口數量要比最大IP數多,否則可能出現無法連接的情況
PASSIVE_PORTS = (8300, 8500)
# 是否開啟匿名訪問 on|off
ENABLE_ANONYMOUS = 'off'
# 匿名用戶目錄
ANONYMOUS_PATH = 'E:/ftp/temp'
# 日志文件
LOGING_NAME = 'pyftp.log'
# 歡迎信息
WELCOME_MSG = 'Welcome to my ftp'

user.ini

[alex]
password=123
perm=elradfmwM
home=E:/ftp/

[egon]
password=123456
perm=elradfmwM
home=E:/ftp/

將ftp_server.py開啟了,就可以在瀏覽器查看這個ftp服務器了

 

 在瀏覽器上可以下載,但是不能上傳(也可能是我沒有找到),所以又實現了一個ftp_client.py來實現上傳下載功能。

ftp_client.py

# coding: utf-8

import os
from ftplib import FTP


# 構造FTP客戶端
def ftp_connect(host, username, password):
    ftp_client = FTP()
    ftp_client.connect(host, 21)
    ftp_client.login(username, password)
    return ftp_client


# 從ftp服務器下載文件
def download_file(ftp, remote_path, local_path):
    buf_size = 1024
    fp = open(local_path, 'wb')
    ftp.retrbinary('RETR ' + remote_path, fp.write, buf_size)
    ftp.set_debuglevel(0)
    fp.close()


# 從本地上傳文件到ftp
def upload_file(ftp, remote_path, local_path):
    bufsize = 1024
    fp = open(local_path, 'rb')
    ftp.storbinary('STOR '+ remote_path, fp, bufsize)
    ftp.set_debuglevel(0)
    fp.close()


if __name__ == "__main__":
    ftp = ftp_connect("127.0.0.1", "alex", "123")
    download_file(ftp, r"/temp/1.txt", r"D:\test\1.txt")
    upload_file(ftp, r"/temp2/2.txt", r"D:\test\1.txt")
    ftp.quit()

查看/temp/發現果然多了一個2.txt文件,說明大功告成!

參考:

https://www.cnblogs.com/jiyanjiao-702521/p/10436094.html

https://www.cnblogs.com/huangxm/p/6274645.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM