python實現FTP伺服器
FTP服務的主動模式和被動模式
在開始之前,先聊一下FTP的主動模式和被動模式,兩者的區別 , 用兩張圖來表示可能會更加清晰一些:
主動模式:
主動模式工作過程:
1. 客戶端以隨機非特權埠N,就是大於1024的埠,對server端21埠發起連線
2. 客戶端開始監聽 N+1埠;
3. 服務端會主動以20埠連線到客戶端的N+1埠。
主動模式的優點:
服務端配置簡單,利於伺服器安全管理,伺服器只需要開放21埠
主動模式的缺點:
如果客戶端開啟了防火牆,或客戶端處於內網(NAT閘道器之後), 那麼伺服器對客戶端埠發起的連線可能會失敗
被動模式:
被動模式工作過程:
1. 客戶端以隨機非特權埠連線服務端的21埠
2. 服務端開啟一個非特權埠為被動埠,並返回給客戶端
3. 客戶端以非特權埠+1的埠主動連線服務端的被動埠
被動模式缺點:
伺服器配置管理稍顯複雜,不利於安全,伺服器需要開放隨機高位埠以便客戶端可以連線,因此大多數FTP服務軟體都可以手動配置被動埠的範圍
被動模式的優點:
對客戶端網路環境沒有要求
瞭解了FTP之後,開始使用python來實現FTP服務
準備工作
本次使用python版本:python 3.4.3
安裝模組 pyftpdlib
pip3 install pyftpdlib
建立程式碼檔案 FtpServer.py
程式碼
實現簡單的本地驗證
from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers importFTPHandler from pyftpdlib.servers import FTPServer #例項化虛擬使用者,這是FTP驗證首要條件 authorizer = DummyAuthorizer() #新增使用者許可權和路徑,括號內的引數是(使用者名稱, 密碼, 使用者目錄, 許可權) authorizer.add_user('user', '12345', '/home/', perm='elradfmw') #新增匿名使用者 只需要路徑 authorizer.add_anonymous('/home/huangxm') #初始化ftp控制代碼 handler = FTPHandler handler.authorizer= authorizer #監聽ip 和 埠,因為linux裡非root使用者無法使用21埠,所以我使用了2121埠 server = FTPServer(('192.168.0.108', 2121), handler) #開始服務 server.serve_forever()
開啟服務
$python FtpServer.py
測試一下:
輸入個錯誤密碼試試:
驗證不通過,無法登入 。
但這似乎是主動模式的FTP ,如何實現被動模式呢?
通過以下程式碼新增被動埠:
handler.passive_ports = range(2000,2333)
完整程式碼:
from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import FTPHandler from pyftpdlib.servers import FTPServer #例項化虛擬使用者,這是FTP驗證首要條件 authorizer = DummyAuthorizer() #新增使用者許可權和路徑,括號內的引數是(使用者名稱, 密碼, 使用者目錄, 許可權) authorizer.add_user('user', '12345', '/home/', perm='elradfmw') #新增匿名使用者 只需要路徑 authorizer.add_anonymous('/home/huangxm') #初始化ftp控制代碼 handler = FTPHandler handler.authorizer = authorizer #新增被動埠範圍 handler.passive_ports = range(2000, 2333) #監聽ip 和 埠 server = FTPServer(('192.168.0.108', 2121), handler) #開始服務 server.serve_forever()
開啟服務,可以看到被動埠的資訊:
$ python FtpServer.py [I 2017-01-11 15:18:37] >>> starting FTP server on 192.168.0.108:2121, pid=46296 <<< [I 2017-01-11 15:18:37] concurrency model: async [I 2017-01-11 15:18:37] masquerade (NAT) address: None [I 2017-01-11 15:18:37] passive ports: 2000->2332
FTP使用者管理:
通過上面的實踐,FTP伺服器已經可以正常工作了,但是如果需要很多個FTP使用者呢,怎麼辦呢? 每個使用者都寫一遍嗎?
其實我們可以定義一個使用者檔案user.py
#使用者名稱 密碼 許可權 目錄 # root 12345 elradfmwM /home huangxm 12345 elradfmwM /home
然後遍歷該檔案,將不以#開頭的行加入到user_list列表中
完整程式碼:
from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import FTPHandler from pyftpdlib.servers import FTPServer def get_user(userfile): #定義一個使用者列表 user_list = [] with open(userfile) as f: for line in f: print(len(line.split())) if not line.startswith('#') and line: if len(line.split()) == 4: user_list.append(line.split()) else: print("user.conf配置錯誤") return user_list #例項化虛擬使用者,這是FTP驗證首要條件 authorizer = DummyAuthorizer() #新增使用者許可權和路徑,括號內的引數是(使用者名稱, 密碼, 使用者目錄, 許可權) #authorizer.add_user('user', '12345', '/home/', perm='elradfmw') user_list = get_user('/home/huangxm/test_py/FtpServer/user.conf') for user in user_list: name, passwd, permit, homedir = user try: authorizer.add_user(name, passwd, homedir, perm=permit) except Exception as e: print(e) #新增匿名使用者 只需要路徑 authorizer.add_anonymous('/home/huangxm') #初始化ftp控制代碼 handler = FTPHandler handler.authorizer = authorizer #新增被動埠範圍 handler.passive_ports = range(2000, 2333) #監聽ip 和 埠 server = FTPServer(('192.168.0.108', 2121), handler) #開始服務 server.serve_forever()
到這裡,FTP 服務已經完成了。
規範一下程式碼
首先建立conf目錄,存放settings.py和user.py
目錄結構(cache裡面的不用管):
setting.py
ip = '0.0.0.0' port = '2121' #上傳速度 300kb/s max_upload = 300 * 1024 #下載速度 300kb/s max_download = 300 * 1024 #最大連線數 max_cons = 150 #最多IP數 max_per_ip = 10 #被動埠範圍,注意被動埠數量要比最大IP數多,否則可能出現無法連線的情況 passive_ports = (2000, 2200) #是否開啟匿名訪問 on|off enable_anonymous = 'off' #匿名使用者目錄 anonymous_path = '/home/huangxm' #是否開啟日誌 on|off enable_logging = 'off' #日誌檔案 loging_name = 'pyftp.log' #歡迎資訊 welcome_msg = 'Welcome to my ftp'
user.py
#使用者名稱 密碼 許可權 目錄 #root 12345 elradfmwM /home/ huangxm 12345 elradfmwM /home/ test 12345 elradfmwM /home/huangxm
FtpServer.py
from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import FTPHandler, ThrottledDTPHandler from pyftpdlib.servers import FTPServer from conf import settings import logging def get_user(userfile): #定義一個使用者列表 user_list = [] with open(userfile) as f: for line in f: if not line.startswith('#') and line: if len(line.split()) == 4: user_list.append(line.split()) else: print("user.conf配置錯誤") return user_list def ftp_server(): #例項化虛擬使用者,這是FTP驗證首要條件 authorizer = DummyAuthorizer() #新增使用者許可權和路徑,括號內的引數是(使用者名稱, 密碼, 使用者目錄, 許可權) #authorizer.add_user('user', '12345', '/home/', perm='elradfmw') user_list = get_user('conf/user.py') for user in user_list: name, passwd, permit, homedir = user try: authorizer.add_user(name, passwd, homedir, perm=permit) except Exception as e: print(e) #新增匿名使用者 只需要路徑 if settings.enable_anonymous == 'on': authorizer.add_anonymous(settings.anonymous_path) #下載上傳速度設定 dtp_handler = ThrottledDTPHandler dtp_handler.read_limit = settings.max_download dtp_handler.write_limit = settings.max_upload #初始化ftp控制代碼 handler = FTPHandler handler.authorizer = authorizer #日誌記錄 if settings.enable_logging == 'on': logging.basicConfig(filename=settings.loging_name, level=logging.INFO) #歡迎資訊 handler.banner = settings.welcome_msg #新增被動埠範圍 handler.passive_ports = range(settings.passive_ports[0], settings.passive_ports[1]) #監聽ip 和 埠 server = FTPServer((settings.ip, settings.port), handler) #最大連線數 server.max_cons = settings.max_cons server.max_cons_per_ip = settings.max_per_ip #開始服務 print('開始服務') server.serve_forever() if __name__ == "__main__": ftp_server()
最後,說一下許可權問題
讀許可權 :
e | 改變檔案目錄 |
l | 列出檔案 |
r | 從伺服器接收檔案 |
寫許可權 :
a | 檔案上傳 |
d | 刪除檔案 |
f | 檔案重新命名 |
m | 建立檔案 |
w | 寫許可權 |
M | 檔案傳輸模式(通過FTP設定檔案許可權 ) |
M 示例:
到伺服器上檢視一下許可權:
可以看到許可權已經被修改了。
相關推薦
python實現FTP伺服器
FTP服務的主動模式和被動模式在開始之前,先聊一下FTP的主動模式和被動模式,兩者的區別 , 用兩張圖來表示可能會更加清晰一些:主動模式:主動模式工作過程:1. 客戶端以隨機非特權埠N,就是大於1024的埠,對server端21埠發起連線2. 客戶端開始監聽 N+1埠;3.
python實現ftp(客戶端)
index 登錄 容器 socket per add gbk 默認值 interact 該文檔為用python3實現ftp上傳下載等功能。 1 import optparse 2 import socket 3 import json,os 4 import sh
python實現ftp服務器(使用wxpython實現GUI界面)
python wxpython pyftpdlib FTP服務器 pyinstaller 開發背景: 有時需要在局域網傳輸文件,總是要用U盤傳輸,要是多個人都需要同樣的文件,U盤就有點麻煩了,Windows上的文件共享配置步驟很少,但是經常因為各種原因失敗,又要檢查來檢查去的。於是考慮到通
Java實現FTP伺服器檔案的上傳和下載
一、前言: 最近剛好需要實現這個功能:實現ftp的上傳和下載。在網上找了下資料,總結了下。直接上程式碼: 二、程式碼示例: 首先使用到的maven依賴: <dependency> <groupId>commons-ne
python 實現代理伺服器
# encoding:utf-8 import socket import thread import re def getAddr(d): a = re.search("Host: (.*)\r\n", d) host = a.group(1) a = host.split(":") if
Java實現FTP伺服器上傳、下載、下載多個寫入本地、刪除
場景:需要從FTP伺服器一個檔案目錄下down下來所有的檔案,上傳到專案某個目錄下。 上傳下載刪除獲取檔案下所有檔案,順便加上獲取到所有檔案進行下載。 package a1; /** * 1----public boolean uploadFile(String path ,Fi
Python 實現遠端伺服器批量執行命令
paramiko 遠端控制介紹 Python paramiko是一個相當好用的遠端登入模組,採用ssh協議,可以實現linux伺服器的ssh遠端登入。首先來看一個簡單的例子 import paramiko #例項化ssh客戶端 ssh = paramiko.SSHCli
使用Python搭建FTP伺服器
SimpleHTTPServer 模組可以把你指定目錄中的檔案和資料夾以一個簡單的 Web 頁面的方式展示出來。 假設我們需要以 Web 方式共享目錄 /Users/Mike/Docker,只需要以下這個命令列就可以輕鬆實現: $ cd /Users/Mike/Docke
python實現tcp伺服器和客戶端(socket)
python實現tcp伺服器和客戶端(socket) 1.socket模組 socket是什麼 socket最初是為了同一主機上的應用程式建立的,使得一個程式與另外一個程式之間可以通訊,也就是所謂的程序間通訊,有兩種型別的socket:基於檔案和麵向網路的。
SpringMVC實現FTP伺服器之圖片和富文字上傳
上傳流程為: jsp(上傳檔案)->springMVC的servlet.xml(解析成二進位制Mulitfile)->Controller->service(連線ftp,檔案打包按格式二進位制流上傳)->ftp 注:本文的程式
關於開源專案——C語言實現FTP伺服器的結構解析
專案地址:https://github.com/beckysag/ftp 針對此開源專案的說明,結構分析。 服務端整體框架: 1. 從命令列輸入得到服務端繫結埠號 2. 設定套介面選項,建立監聽套接字。 3. 用while迴圈 + fo
python 實現CAS伺服器認證
##CAS登陸流程##。如https://my.oschina.net/aiguozhe/blog/160715中所示。 由於CAS不提供rest請求來通過認證。可行的方法是模擬瀏覽器請求,填入使用者名稱和密碼來實現認證流程。 一、通過fiddler抓取登陸過程報文:
python實現FTP弱口令掃描器與簡單端口掃描器
map python實現 nbsp thread txt 獲取 繼續 cheng 端口開放 python實現FTP弱口令掃描器與簡單端口掃描器 目錄 FTP弱口令掃描器 簡單端口掃描器 參考: https://blog.csdn.net/rebelqsp/a
python實現FTP弱口令掃描器與簡單埠掃描器
python實現FTP弱口令掃描器與簡單埠掃描器 目錄 FTP弱口令掃描器 簡單埠掃描器 參考: https://blog.csdn.net/rebelqsp/article/details/22109925 https://www.aliyun.com
Python實現FTP暴力破解
最近在看《Violent Python》,記錄一些程式碼實現。 0x00 FTP暴力破解之PTYHON實現 需使用ftplib庫,書中採用單執行緒,這裡我使用了多執行緒完成,匿名登入的問題暫時沒有找機子試,如有問題可以探討~ 0x01 程式碼實現 import optpa
Python之FTP伺服器暴力破解(注入木馬)
密碼字典下載:[email protected]:qq_21792169/dictionary.gitftp.py#!/usr/bin/python # -*- coding: utf-8 -*- import ftplib import optparse impo
python 刪除ftp伺服器目錄
解決這個問題: ftplib.error_perm: 550 Delete operation failed. def ClearPictPeriodly(self,iDay = 10): currentTime = dat
python 實現ftp檔案下載
python 版本 2.7 程式碼: #-*-coding:utf-8-*- import os import time from ftplib import FTP #伺服器地址 FTP_
python開發ftp伺服器(pyftpdlib)
轉載自https://blog.csdn.net/qiye_/article/details/50771195今天想在實驗室搭建一個ftp伺服器,用來分享一些資料,於是就想到了利用python來進行開發。ftp伺服器的本質還是利用socket程式設計來實現,只不過遵循特定的協