亚洲欧美日韩综合系列在线_91精品人妻一区二区_欧美大肥婆一级特大AA片_九色91视频免费观看_亚洲综合国产精品_av中文字幕在线不卡_久久精品色综合网_看黄色视频的软件_无卡无码高清中文字幕码2024_亚洲欧美日韩天堂网

python實(shí)現(xiàn)FTP服務(wù)器

來源:昵稱最煩了 發(fā)布時(shí)間:2018-11-03 15:50:20 閱讀量:1041

FTP服務(wù)的主動(dòng)模式和被動(dòng)模式

在開始之前,先聊一下FTP的主動(dòng)模式和被動(dòng)模式,兩者的區(qū)別 , 用兩張圖來表示可能會(huì)更加清晰一些:

主動(dòng)模式:

image

主動(dòng)模式工作過程:

1. 客戶端以隨機(jī)非特權(quán)端口N,就是大于1024的端口,對(duì)server端21端口發(fā)起連接

2. 客戶端開始監(jiān)聽 N+1端口;

3. 服務(wù)端會(huì)主動(dòng)以20端口連接到客戶端的N+1端口。

主動(dòng)模式的優(yōu)點(diǎn):

服務(wù)端配置簡(jiǎn)單,利于服務(wù)器安全管理,服務(wù)器只需要開放21端口

主動(dòng)模式的缺點(diǎn):

如果客戶端開啟了防火墻,或客戶端處于內(nèi)網(wǎng)(NAT網(wǎng)關(guān)之后), 那么服務(wù)器對(duì)客戶端端口發(fā)起的連接可能會(huì)失敗

 

被動(dòng)模式:

image

被動(dòng)模式工作過程:

1. 客戶端以隨機(jī)非特權(quán)端口連接服務(wù)端的21端口

2. 服務(wù)端開啟一個(gè)非特權(quán)端口為被動(dòng)端口,并返回給客戶端

3. 客戶端以非特權(quán)端口+1的端口主動(dòng)連接服務(wù)端的被動(dòng)端口

被動(dòng)模式缺點(diǎn):

服務(wù)器配置管理稍顯復(fù)雜,不利于安全,服務(wù)器需要開放隨機(jī)高位端口以便客戶端可以連接,因此大多數(shù)FTP服務(wù)軟件都可以手動(dòng)配置被動(dòng)端口的范圍

被動(dòng)模式的優(yōu)點(diǎn):

對(duì)客戶端網(wǎng)絡(luò)環(huán)境沒有要求

 

了解了FTP之后,開始使用python來實(shí)現(xiàn)FTP服務(wù)

準(zhǔn)備工作

本次使用python版本:python 3.4.3

安裝模塊 pyftpdlib

pip3 install pyftpdlib

創(chuàng)建代碼文件 FtpServer.py

 

代碼

實(shí)現(xiàn)簡(jiǎn)單的本地驗(yàn)證

復(fù)制代碼
from pyftpdlib.authorizers import DummyAuthorizerfrom pyftpdlib.handlers import FTPHandlerfrom pyftpdlib.servers import FTPServer#實(shí)例化虛擬用戶,這是FTP驗(yàn)證首要條件authorizer = DummyAuthorizer()#添加用戶權(quán)限和路徑,括號(hào)內(nèi)的參數(shù)是(用戶名, 密碼, 用戶目錄, 權(quán)限)authorizer.add_user('user', '12345', '/home/', perm='elradfmw')#添加匿名用戶 只需要路徑authorizer.add_anonymous('/home/huangxm')#初始化ftp句柄handler = FTPHandler
handler.authorizer = authorizer#監(jiān)聽ip 和 端口,因?yàn)閘inux里非root用戶無法使用21端口,所以我使用了2121端口server = FTPServer(('192.168.0.108', 2121), handler)#開始服務(wù)server.serve_forever()
復(fù)制代碼

開啟服務(wù)

$python FtpServer.py

測(cè)試一下:

image

輸入個(gè)錯(cuò)誤密碼試試:

image

驗(yàn)證不通過,無法登錄 。

但這似乎是主動(dòng)模式的FTP ,如何實(shí)現(xiàn)被動(dòng)模式呢?

通過以下代碼添加被動(dòng)端口:

handler.passive_ports = range(2000,2333)

完整代碼:

復(fù)制代碼
from pyftpdlib.authorizers import DummyAuthorizerfrom pyftpdlib.handlers import FTPHandlerfrom pyftpdlib.servers import FTPServer#實(shí)例化虛擬用戶,這是FTP驗(yàn)證首要條件authorizer = DummyAuthorizer()#添加用戶權(quán)限和路徑,括號(hào)內(nèi)的參數(shù)是(用戶名, 密碼, 用戶目錄, 權(quán)限)authorizer.add_user('user', '12345', '/home/', perm='elradfmw')#添加匿名用戶 只需要路徑authorizer.add_anonymous('/home/huangxm')#初始化ftp句柄handler = FTPHandler
handler.authorizer = authorizer#添加被動(dòng)端口范圍handler.passive_ports = range(2000, 2333)#監(jiān)聽ip 和 端口server = FTPServer(('192.168.0.108', 2121), handler)#開始服務(wù)server.serve_forever()
復(fù)制代碼

開啟服務(wù),可以看到被動(dòng)端口的信息:

$ 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用戶管理:

通過上面的實(shí)踐,F(xiàn)TP服務(wù)器已經(jīng)可以正常工作了,但是如果需要很多個(gè)FTP用戶呢,怎么辦呢? 每個(gè)用戶都寫一遍嗎?

其實(shí)我們可以定義一個(gè)用戶文件user.py

#用戶名     密碼       權(quán)限         目錄
# root      12345      elradfmwM    /home
huangxm     12345      elradfmwM    /home

然后遍歷該文件,將不以#開頭的行加入到user_list列表中

完整代碼:

復(fù)制代碼
from pyftpdlib.authorizers import DummyAuthorizerfrom pyftpdlib.handlers import FTPHandlerfrom pyftpdlib.servers import FTPServerdef get_user(userfile):    #定義一個(gè)用戶列表
    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配置錯(cuò)誤")    return user_list#實(shí)例化虛擬用戶,這是FTP驗(yàn)證首要條件authorizer = DummyAuthorizer()#添加用戶權(quán)限和路徑,括號(hào)內(nèi)的參數(shù)是(用戶名, 密碼, 用戶目錄, 權(quán)限)#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#添加被動(dòng)端口范圍handler.passive_ports = range(2000, 2333)#監(jiān)聽ip 和 端口server = FTPServer(('192.168.0.108', 2121), handler)#開始服務(wù)server.serve_forever()
復(fù)制代碼

到這里,F(xiàn)TP 服務(wù)已經(jīng)完成了。

 

規(guī)范一下代碼

首先創(chuàng)建conf目錄,存放settings.py和user.py

目錄結(jié)構(gòu)(cache里面的不用管):

image

 

setting.py

復(fù)制代碼
ip = '0.0.0.0'port = '2121'#上傳速度  300kb/smax_upload = 300 * 1024#下載速度 300kb/smax_download = 300 * 1024#最大連接數(shù)max_cons = 150#最多IP數(shù)max_per_ip = 10#被動(dòng)端口范圍,注意被動(dòng)端口數(shù)量要比最大IP數(shù)多,否則可能出現(xiàn)無法連接的情況passive_ports = (2000, 2200)#是否開啟匿名訪問 on|offenable_anonymous = 'off'#匿名用戶目錄anonymous_path = '/home/huangxm'#是否開啟日志 on|offenable_logging = 'off'#日志文件loging_name = 'pyftp.log'#歡迎信息welcome_msg = 'Welcome to my ftp'
復(fù)制代碼

user.py

#用戶名     密碼       權(quán)限         目錄#root      12345      elradfmwM    /home/huangxm     12345      elradfmwM    /home/test       12345      elradfmwM    /home/huangxm

FtpServer.py

復(fù)制代碼
from pyftpdlib.authorizers import DummyAuthorizerfrom pyftpdlib.handlers import FTPHandler, ThrottledDTPHandlerfrom pyftpdlib.servers import FTPServerfrom conf import settingsimport loggingdef get_user(userfile):    #定義一個(gè)用戶列表
    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配置錯(cuò)誤")    return user_listdef ftp_server():    #實(shí)例化虛擬用戶,這是FTP驗(yàn)證首要條件
    authorizer = DummyAuthorizer()    
    #添加用戶權(quán)限和路徑,括號(hào)內(nèi)的參數(shù)是(用戶名, 密碼, 用戶目錄, 權(quán)限)
    #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)    
    #下載上傳速度設(shè)置
    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    

    #添加被動(dòng)端口范圍
    handler.passive_ports = range(settings.passive_ports[0], settings.passive_ports[1])    #監(jiān)聽ip 和 端口
    server = FTPServer((settings.ip, settings.port), handler)    
    #最大連接數(shù)
    server.max_cons = settings.max_cons
    server.max_cons_per_ip = settings.max_per_ip    
    #開始服務(wù)
    print('開始服務(wù)')
    server.serve_forever()if __name__ == "__main__":
    ftp_server()
復(fù)制代碼

 

最后,說一下權(quán)限問題

讀權(quán)限 :

e改變文件目錄
l列出文件
r從服務(wù)器接收文件

寫權(quán)限 :

a文件上傳
d刪除文件
f文件重命名
m創(chuàng)建文件
w寫權(quán)限
M文件傳輸模式(通過FTP設(shè)置文件權(quán)限 )

M 示例:

image

到服務(wù)器上查看一下權(quán)限:

image

可以看到權(quán)限已經(jīng)被修改了。


標(biāo)簽: 服務(wù)器搭建
分享:
評(píng)論:
你還沒有登錄,請(qǐng)先