日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Python如何實(shí)現(xiàn)FTP功能

瀏覽:29日期:2022-07-24 08:29:12

Python版本

實(shí)現(xiàn)了比之前的xxftp更多更完善的功能

1、繼續(xù)支持多用戶

2、繼續(xù)支持虛擬目錄

3、增加支持用戶根目錄以及映射虛擬目錄的權(quán)限設(shè)置

4、增加支持限制用戶根目錄或者虛擬目錄的空間大小

xxftp的特點(diǎn)

1、開源、跨平臺

2、簡單、易用

3、不需要數(shù)據(jù)庫

4、可擴(kuò)展性超強(qiáng)

5、你可以免費(fèi)使用xxftp假設(shè)自己的私人FTP服務(wù)器

匿名帳號可以使用!

匿名根目錄只讀,映射了一個(gè)虛擬目錄,可以上傳文件但不允許更改!

使用方法

跟用C語言寫的xxftp使用方法一樣

FTP服務(wù)器目錄結(jié)構(gòu)

-/root -xxftp.welcome -xxftp.goodbye -user1 -.xxftp -password -... -user2 -.xxftp -password -... -anonymous源代碼

代碼如下:

import socket, threading, os, sys, time import hashlib, platform, stat listen_ip = 'localhost' listen_port = 21 conn_list = [] root_dir = './home' max_connections = 500 conn_timeout = 120 class FtpConnection(threading.Thread): def __init__(self, fd): threading.Thread.__init__(self) self.fd = fd self.running = True self.setDaemon(True) self.alive_time = time.time() self.option_utf8 = False self.identified = False self.option_pasv = True self.username = '' def process(self, cmd, arg): cmd = cmd.upper(); if self.option_utf8: arg = unicode(arg, 'utf8').encode(sys.getfilesystemencoding()) print '<<', cmd, arg, self.fd # Ftp Command if cmd == 'BYE' or cmd == 'QUIT': if os.path.exists(root_dir + '/xxftp.goodbye'): self.message(221, open(root_dir + '/xxftp.goodbye').read()) else: self.message(221, 'Bye!') self.running = False return elif cmd == 'USER': # Set Anonymous User if arg == '': arg = 'anonymous' for c in arg: if not c.isalpha() and not c.isdigit() and c!='_': self.message(530, 'Incorrect username.') return self.username = arg self.home_dir = root_dir + '/' + self.username self.curr_dir = '/' self.curr_dir, self.full_path, permission, self.vdir_list, limit_size, is_virtual = self.parse_path('/') if not os.path.isdir(self.home_dir): self.message(530, 'User ' + self.username + ' not exists.') return self.pass_path = self.home_dir + '/.xxftp/password' if os.path.isfile(self.pass_path): self.message(331, 'Password required for ' + self.username) else: self.message(230, 'Identified!') self.identified = True return elif cmd == 'PASS': if open(self.pass_path).read() == hashlib.md5(arg).hexdigest(): self.message(230, 'Identified!') self.identified = True else: self.message(530, 'Not identified!') self.identified = False return elif not self.identified: self.message(530, 'Please login with USER and PASS.') return self.alive_time = time.time() finish = True if cmd == 'NOOP': self.message(200, 'ok') elif cmd == 'TYPE': self.message(200, 'ok') elif cmd == 'SYST': self.message(200, 'UNIX') elif cmd == 'EPSV' or cmd == 'PASV': self.option_pasv = True try: self.data_fd = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.data_fd.bind((listen_ip, 0)) self.data_fd.listen(1) ip, port = self.data_fd.getsockname() if cmd == 'EPSV': self.message(229, 'Entering Extended Passive Mode (|||' + str(port) + '|)') else: ipnum = socket.inet_aton(ip) self.message(227, 'Entering Passive Mode (%s,%u,%u).' % (','.join(ip.split('.')), (port>>8&0xff), (port&0xff))) except: self.message(500, 'failed to create data socket.') elif cmd == 'EPRT': self.message(500, 'implement EPRT later...') elif cmd == 'PORT': self.option_pasv = False self.data_fd = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s = arg.split(',') self.data_ip = '.'.join(s[:4]) self.data_port = int(s[4])*256 + int(s[5]) self.message(200, 'ok') elif cmd == 'PWD' or cmd == 'XPWD': if self.curr_dir == '': self.curr_dir = '/' self.message(257, ’'’ + self.curr_dir + ’'’) elif cmd == 'LIST' or cmd == 'NLST': if arg != '' and arg[0] == '-': arg = '' # omit parameters remote, local, perm, vdir_list, limit_size, is_virtual = self.parse_path(arg) if not os.path.exists(local): self.message(550, 'failed.') return if not self.establish(): return self.message(150, 'ok') for v in vdir_list: f = v[0] if self.option_utf8: f = unicode(f, sys.getfilesystemencoding()).encode('utf8') if cmd == 'NLST': info = f + 'rn' else: info = 'd%s%s------- %04u %8s %8s %8lu %s %srn' % ( 'r' if 'read' in perm else '-', 'w' if 'write' in perm else '-', 1, '0', '0', 0, time.strftime('%b %d %Y', time.localtime(time.time())), f) self.data_fd.send(info) for f in os.listdir(local): if f[0] == '.': continue path = local + '/' + f if self.option_utf8: f = unicode(f, sys.getfilesystemencoding()).encode('utf8') if cmd == 'NLST': info = f + 'rn' else: st = os.stat(path) info = '%s%s%s------- %04u %8s %8s %8lu %s %srn' % ( '-' if os.path.isfile(path) else 'd', 'r' if 'read' in perm else '-', 'w' if 'write' in perm else '-', 1, '0', '0', st[stat.ST_SIZE], time.strftime('%b %d %Y', time.localtime(st[stat.ST_MTIME])), f) self.data_fd.send(info) self.message(226, 'Limit size: ' + str(limit_size)) self.data_fd.close() self.data_fd = 0 elif cmd == 'REST': self.file_pos = int(arg) self.message(250, 'ok') elif cmd == 'FEAT': features = '211-Features:rnSITESrnEPRTrnEPSVrnMDTMrnPASVrn' 'REST STREAMrnSIZErnUTF8rn211 Endrn' self.fd.send(features) elif cmd == 'OPTS': arg = arg.upper() if arg == 'UTF8 ON': self.option_utf8 = True self.message(200, 'ok') elif arg == 'UTF8 OFF': self.option_utf8 = False self.message(200, 'ok') else: self.message(500, 'unrecognized option') elif cmd == 'CDUP': finish = False arg = '..' else: finish = False if finish: return # Parse argument ( It’s a path ) if arg == '': self.message(500, 'where’s my argument?') return remote, local, permission, vdir_list, limit_size, is_virtual = self.parse_path(arg) # can not do anything to virtual directory if is_virtual: permission = 'none' can_read, can_write, can_modify = 'read' in permission, 'write' in permission, 'modify' in permission newpath = local try: if cmd == 'CWD': if(os.path.isdir(newpath)): self.curr_dir = remote self.full_path = newpath self.message(250, ’'’ + remote + ’'’) else: self.message(550, 'failed') elif cmd == 'MDTM': if os.path.exists(newpath): self.message(213, time.strftime('%Y%m%d%I%M%S', time.localtime( os.path.getmtime(newpath)))) else: self.message(550, 'failed') elif cmd == 'SIZE': self.message(231, os.path.getsize(newpath)) elif cmd == 'XMKD' or cmd == 'MKD': if not can_modify: self.message(550, 'permission denied.') return os.mkdir(newpath) self.message(250, 'ok') elif cmd == 'RNFR': if not can_modify: self.message(550, 'permission denied.') return self.temp_path = newpath self.message(350, 'rename from ' + remote) elif cmd == 'RNTO': os.rename(self.temp_path, newpath) self.message(250, 'RNTO to ' + remote) elif cmd == 'XRMD' or cmd == 'RMD': if not can_modify: self.message(550, 'permission denied.') return os.rmdir(newpath) self.message(250, 'ok') elif cmd == 'DELE': if not can_modify: self.message(550, 'permission denied.') return os.remove(newpath) self.message(250, 'ok') elif cmd == 'RETR': if not os.path.isfile(newpath): self.message(550, 'failed') return if not can_read: self.message(550, 'permission denied.') return if not self.establish(): return self.message(150, 'ok') f = open(newpath, 'rb') while self.running: self.alive_time = time.time() data = f.read(8192) if len(data) == 0: break self.data_fd.send(data) f.close() self.data_fd.close() self.data_fd = 0 self.message(226, 'ok') elif cmd == 'STOR' or cmd == 'APPE': if not can_write: self.message(550, 'permission denied.') return if os.path.exists(newpath) and not can_modify: self.message(550, 'permission denied.') return # Check space size remained! used_size = 0 if limit_size > 0: used_size = self.get_dir_size(os.path.dirname(newpath)) if not self.establish(): return self.message(150, 'ok') f = open(newpath, ('ab' if cmd == 'APPE' else 'wb') ) while self.running: self.alive_time = time.time() data = self.data_fd.recv(8192) if len(data) == 0: break if limit_size > 0: used_size = used_size + len(data) if used_size > limit_size: break f.write(data) f.close() self.data_fd.close() self.data_fd = 0 if limit_size > 0 and used_size > limit_size: self.message(550, 'Exceeding user space limit: ' + str(limit_size) + ' bytes') else: self.message(226, 'ok') else: self.message(500, cmd + ' not implemented') except: self.message(550, 'failed.') def establish(self): if self.data_fd == 0: self.message(500, 'no data connection') return False if self.option_pasv: fd = self.data_fd.accept()[0] self.data_fd.close() self.data_fd = fd else: try: self.data_fd.connect((self.data_ip, self.data_port)) except: self.message(500, 'failed to establish data connection') return False return True def read_virtual(self, path): vdir_list = [] path = path + '/.xxftp/virtual' if os.path.isfile(path): for v in open(path, 'r').readlines(): items = v.split() items[1] = items[1].replace('$root', root_dir) vdir_list.append(items) return vdir_list def get_dir_size(self, folder): size = 0 for path, dirs, files in os.walk(folder): for f in files: size += os.path.getsize(os.path.join(path, f)) return size def read_size(self, path): size = 0 path = path + '/.xxftp/size' if os.path.isfile(path): size = int(open(path, 'r').readline()) return size def read_permission(self, path): permission = 'read,write,modify' path = path + '/.xxftp/permission' if os.path.isfile(path): permission = open(path, 'r').readline() return permission def parse_path(self, path): if path == '': path = '.' if path[0] != '/': path = self.curr_dir + '/' + path s = os.path.normpath(path).replace('', '/').split('/') local = self.home_dir # reset directory permission vdir_list = self.read_virtual(local) limit_size = self.read_size(local) permission = self.read_permission(local) remote = '' is_virtual = False for name in s: name = name.lstrip('.') if name == '': continue remote = remote + '/' + name is_virtual = False for v in vdir_list: if v[0] == name: permission = v[2] local = v[1] limit_size = self.read_size(local) is_virtual = True if not is_virtual: local = local + '/' + name vdir_list = self.read_virtual(local) return (remote, local, permission, vdir_list, limit_size, is_virtual) def run(self): ’’’ Connection Process ’’’ try: if len(conn_list) > max_connections: self.message(500, 'too many connections!') self.fd.close() self.running = False return # Welcome Message if os.path.exists(root_dir + '/xxftp.welcome'): self.message(220, open(root_dir + '/xxftp.welcome').read()) else: self.message(220, 'xxftp(Python) www.xiaoxia.org') # Command Loop line = '' while self.running: data = self.fd.recv(4096) if len(data) == 0: break line += data if line[-2:] != 'rn': continue line = line[:-2] space = line.find(' ') if space == -1: self.process(line, '') else: self.process(line[:space], line[space+1:]) line = '' except: print 'error', sys.exc_info() self.running = False self.fd.close() print 'connection end', self.fd, 'user', self.username def message(self, code, s): ’’’ Send Ftp Message ’’’ s = str(s).replace('r', '') ss = s.split('n') if len(ss) > 1: r = (str(code) + '-') + ('rn' + str(code) + '-').join(ss[:-1]) r += 'rn' + str(code) + ' ' + ss[-1] + 'rn' else: r = str(code) + ' ' + ss[0] + 'rn' if self.option_utf8: r = unicode(r, sys.getfilesystemencoding()).encode('utf8') self.fd.send(r) def server_listen(): global conn_list listen_fd = socket.socket(socket.AF_INET, socket.SOCK_STREAM) listen_fd.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) listen_fd.bind((listen_ip, listen_port)) listen_fd.listen(1024) conn_lock = threading.Lock() print 'ftpd is listening on ', listen_ip + ':' + str(listen_port) while True: conn_fd, remote_addr = listen_fd.accept() print 'connection from ', remote_addr, 'conn_list', len(conn_list) conn = FtpConnection(conn_fd) conn.start() conn_lock.acquire() conn_list.append(conn) # check timeout try: curr_time = time.time() for conn in conn_list: if int(curr_time - conn.alive_time) > conn_timeout: if conn.running == True: conn.fd.shutdown(socket.SHUT_RDWR) conn.running = False conn_list = [conn for conn in conn_list if conn.running] except: print sys.exc_info() conn_lock.release() def main(): server_listen() if __name__ == '__main__': main()

內(nèi)容擴(kuò)展:

FTP服務(wù)器端代碼:

import socket,os,timeimport hashlib server =socket.socket()server.bind((’0.0.0.0’,6666))server.listen()print('等待....')while True: conn,addr = server.accept() print('new conn:',conn) while True: data = conn.recv(1024) if not data: print('client is disconnection') break cmd,filename = data.decode().split() #記錄指令和文件名 print(filename) #判斷當(dāng)前目錄是否存在該文件,而且必須是文件,而不是目錄 if os.path.isfile(filename): f = open(filename,’rb’) #m = hashlib.md5() # 創(chuàng)建md5 file_size = os.stat(filename).st_size #stat() 可以返回文件的大小值 conn.send((str(file_size)).encode()) # 發(fā)送文件大小 conn.recv(1024) #等待返回信息 for line in f: # m.updata(line) conn.send(line) #print('file md5',m.hexdigest()) #打印md5值 f.close()

到此這篇關(guān)于Python如何實(shí)現(xiàn)FTP功能的文章就介紹到這了,更多相關(guān)Python實(shí)現(xiàn)的簡易FTP內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久亚洲欧洲| 午夜精品成人av| 激情久久婷婷| 国产在线一区不卡| 国产精品二区影院| 麻豆国产欧美一区二区三区| 国产乱人伦丫前精品视频| 精品中文字幕一区二区三区av| 免播放器亚洲| 日韩视频在线一区二区三区| 视频在线观看国产精品| 蜜桃视频一区二区| 日韩一区中文| 国产欧美另类| 国产中文欧美日韩在线 | 99国产精品久久久久久久| 日韩av免费| 免费成人网www| 中文字幕一区二区三区在线视频| 亚洲三级欧美| 欧美久久香蕉| 国产成人免费精品| 999久久久国产精品| 不卡av一区二区| 男女性色大片免费观看一区二区| 亚洲不卡系列| jiujiure精品视频播放| 免费高清在线一区| 国产精品入口久久| 亚洲精品第一| 国产精品白丝av嫩草影院| 国产成人免费| 欧美日韩国产传媒| 亚洲精品免费观看| 久久av导航| 久久婷婷久久| 亚洲精品国模| 激情久久99| 最新国产拍偷乱拍精品| 日本少妇一区二区| 精品日本视频| 欧美成人精品| 91大神在线观看线路一区| 福利一区和二区| 日韩亚洲在线| 国产精品白丝久久av网站| 欧美香蕉视频| 亚欧成人精品| 亚洲精品**中文毛片| 亚洲一区二区免费看| 国产精品久久久久9999高清| 99精品在线观看| 高清av不卡| 久久av在线| 福利一区二区三区视频在线观看| 高清久久一区| 丝袜亚洲精品中文字幕一区| 国产亚洲在线观看| 国产日产一区| 欧美在线亚洲| 国产精品第一国产精品| 香蕉久久精品| 日本午夜精品| 国产日产精品一区二区三区四区的观看方式| 久久亚洲不卡| 精品入口麻豆88视频| 亚洲资源av| 91日韩在线| 日韩欧美美女在线观看| 日韩欧美久久| 日本特黄久久久高潮| 日韩欧美少妇| 国产精品一区二区精品视频观看 | 日韩av在线中文字幕| 日韩中文字幕av电影| 麻豆视频在线看| 日韩一区二区三区在线看| 日本欧美一区二区| 亚洲成人精品| 麻豆精品在线| 日韩av中文字幕一区二区| 欧美二区视频| 天堂√8在线中文| 久久不卡日韩美女| 中文字幕一区二区av| 国产一区欧美| 不卡专区在线| 国产精品久久久亚洲一区| 在线视频日韩| 成人久久一区| 97精品一区二区| 国产福利一区二区精品秒拍 | 久久蜜桃精品| 麻豆精品在线| 欧美日韩在线精品一区二区三区激情综合| 国产精品欧美一区二区三区不卡| 免费看一区二区三区| 国产精品嫩草99av在线| 国产成人黄色| 久久97视频| 日韩午夜黄色| 91精品国产成人观看| 成人午夜在线| 欧美精品1区| 青青伊人久久| 日韩精品亚洲专区| 亚洲18在线| 欧美13videosex性极品| 国产欧美高清| 日韩极品在线观看| 蜜桃传媒麻豆第一区在线观看 | 亚洲91网站| 久久午夜精品| 蜜桃久久精品一区二区| 亚洲一区二区免费看| 99国产精品久久久久久久成人热| 国产精选久久| 91亚洲无吗| 国产午夜久久av| 欧美日韩激情| 激情五月综合网| 久久一区二区三区电影| 欧美成人基地 | 日韩亚洲在线| 婷婷亚洲五月| 精品一区欧美| 五月天综合网站| 亚洲少妇在线| 亚洲一区二区三区中文字幕在线观看| 欧美国产视频| 国产视频一区三区| 亚洲专区视频| 久久精品中文| 久久久夜精品| 亚洲激情二区| 三级欧美韩日大片在线看| 国产高清不卡| 亚洲免费福利| 婷婷六月综合| 综合欧美精品| 欧美一区二区三区久久| 91精品国产自产观看在线| 久久亚洲国产| 日韩视频二区| 日本亚洲欧美天堂免费| 国产精品亚洲二区| 精品国产网站| 奇米色欧美一区二区三区| 日韩欧美2区| 国产精品亚洲片在线播放| 免播放器亚洲| 一区二区三区四区日韩| 久久青草久久| 国产一区91| 国产三级一区| 日韩精彩视频在线观看| 国产精品亲子伦av一区二区三区| 亚洲人成毛片在线播放女女| 日韩高清在线不卡| 久久精品色播| 激情欧美丁香| 四虎4545www国产精品 | 偷拍精品精品一区二区三区| 国模 一区 二区 三区| 美女久久一区| 免费视频一区二区三区在线观看| 奇米色欧美一区二区三区| 久久av日韩| 好看不卡的中文字幕| 日韩不卡一二三区| 亚洲国产福利| 国产福利片在线观看| 性欧美xxxx免费岛国不卡电影| 91日韩欧美| 中文精品在线| 久久亚洲资源中文字| 一级欧洲+日本+国产| 欧美一区91| 日韩高清不卡在线| 老司机免费视频一区二区三区| 国产精品一线天粉嫩av| av资源中文在线| 日韩在线卡一卡二| 成人在线黄色| 视频一区欧美日韩| 麻豆精品视频在线| 模特精品在线| 正在播放日韩精品| 日韩在线第七页| 亚洲涩涩av| 日韩欧美国产精品综合嫩v| 亚洲最新av| 日本亚州欧洲精品不卡| 国产成年精品| 蜜臀va亚洲va欧美va天堂| 日韩午夜视频在线| 蜜桃传媒麻豆第一区在线观看| 一区二区精品| 日韩免费久久| 国产精品1区|