Python 程序:ftp

Python 程序:ftp



1、ftp实现功能

2、目录结构

3、代码

4、效果展示


一、ftp实现功能

1、用户登陆认证

2、多用户同时登陆

3、不同用户家目录不同

4、查看目录下文件

5、用户可以在家目录下切换目录

6、用户可以在家目录下创建目录

7、用户可以在家目录下删除文件或目录

8、用户磁盘配额(不同用户配额可不同,当文件大小超出服务器分配空间大小拒绝上传)

9、上传:支持断点续传

10、下载:支持断点续传和进度条显示

二、目录结构

三、代码

  1 import socket,os,json,sys
  2 class FtpClient(object):
  3
  4     def __init__(self,ip,port):
  5         self.client = socket.socket()
  6         self.client.connect((ip,port))
  7         self.exit_flag = False
  8         self.interactive()
  9
 10     def auth(self):
 11         retry_count = 0
 12         while retry_count < 3:
 13             username = input("username:").strip()
 14             if len(username) == 0:continue
 15             # passwd = getpass.getpass("password:")  #pycharm显示有问题
 16             passwd = input("passwd:").strip()
 17             msg_dic = {
 18                 "action":"ftp_auth",
 19                 "username":username,
 20                 "passwd":passwd
 21             }
 22             self.client.send(json.dumps(msg_dic).encode("utf-8"))
 23
 24             auth_feedback = self.client.recv(1024)
 25             auth_feedback = auth_feedback.decode()
 26             if auth_feedback == "success":
 27                 print("\033[32;1m登录成功!\033[0m")
 28                 self.username  = username
 29                 self.cur_path = username
 30                 return True
 31             else:
 32                 print ("\033[31;1m账号密码错误!\033[0m")
 33                 retry_count +=1
 34         else:
 35             print ("\033[31;1m尝试次数过多,exit!\033[0m")
 36
 37     def interactive(self):
 38         ftp_version = self.client.recv(1024)
 39         print(ftp_version.decode())
 40         self.auth()  #登录验证
 41         self.help()
 42         while True:
 43             cmd = input(">>:").strip()
 44             if len(cmd) == 0:
 45                 continue
 46             cmd_str = cmd.split()[0] #输入的第一个字符永远为指令,取出
 47             if hasattr(self,"cmd_%s"%cmd_str):
 48                 func = getattr(self,"cmd_%s"%cmd_str)
 49                 func(cmd)
 50             else:
 51                 self.help()
 52
 53     def cmd_dir(self,*args):
 54         cmd_split = args[0].split()
 55         filename = ‘ ‘.join(cmd_split[1:])
 56         msg_dic = {
 57                     "action":cmd_split[0],
 58                     "filename":filename
 59                 }
 60         self.client.send(json.dumps(msg_dic).encode("utf-8"))
 61         # 防止粘包等服务器确认
 62         cmd_res_size = self.client.recv(1024)
 63         self.client.send(b"ok")
 64         cmd_res_size = int(cmd_res_size.decode())
 65         received_size = 0
 66         while received_size < cmd_res_size:
 67             data = self.client.recv(1024)
 68             received_size +=len(data)
 69             print(data.decode())
 70
 71     def cmd_cd(self,*args):
 72
 73         cmd_split = args[0].split()
 74         filename = ‘ ‘.join(cmd_split[1:])
 75         msg_dic = {
 76                     "action":cmd_split[0],
 77                     "filename":filename
 78                 }
 79         self.client.send(json.dumps(msg_dic).encode("utf-8"))
 80         feedback = self.client.recv(100)
 81         feedback = feedback.decode()
 82         if feedback.startswith("switch_dir::ok"):
 83             self.cur_path  = feedback.split("::")[-1]
 84         else:
 85             print ("\033[31;1m%s\033[0m" % feedback.split("::")[-1])
 86
 87     def cmd_rmdir(self,*args):
 88         cmd_split = args[0].split()
 89         filename = ‘ ‘.join(cmd_split[1:])
 90         msg_dic = {
 91                     "action":cmd_split[0],
 92                     "filename":filename
 93                 }
 94         self.client.send(json.dumps(msg_dic).encode("utf-8"))
 95         feedback = self.client.recv(100)
 96         print(feedback.decode())
 97
 98     def cmd_mkdir(self,*args):  #只支持创建目录,创建文件自己上传就行
 99         cmd_split = args[0].split()
100         filename = ‘ ‘.join(cmd_split[1:])
101         msg_dic = {
102                     "action":cmd_split[0],
103                     "filename":filename
104                 }
105         self.client.send(json.dumps(msg_dic).encode("utf-8"))
106         feedback = self.client.recv(100)
107         print(feedback.decode())
108
109     def cmd_put(self,*args):
110         cmd_split = args[0].split()
111         if len(cmd_split) > 1:
112             filename = cmd_split[1]
113             if os.path.isfile(filename):
114                 filesize = os.stat(filename).st_size
115                 # msg_str = "%s|%s"%(filename,filesize)
116                 msg_dic = {
117                     "action":cmd_split[0],
118                     "filename":filename,
119                     "size":filesize,
120                     "has_file":False
121                 }
122                 self.client.send(json.dumps(msg_dic).encode("utf-8"))
123                 #防止粘包等服务器确认
124                 server_response = self.client.recv(1024)  #此时服务器端判断大小是否超出磁盘配额,返回参数
125                 data = server_response.decode()
126                 data_list= data.split("|")
127                 if data_list[0] == "ok" and data_list[1] == "no":
128                     f = open(filename,"rb")
129                     for line in f :
130                         self.client.send(line)
131                     else:
132                         print("file upload success..")
133                     f.close()
134                 elif data_list[0] == "ok" and data_list[1] != "no":
135                     print(data_list[1])
136                     size = int(data_list[1])
137                     f = open(filename,"rb")
138                     f.seek(size)#seek到断点位置
139                     for line in f :
140                         self.client.send(line)
141                     else:
142                         print("file upload success..")
143                     f.close()
144                 else:
145                     print(server_response.decode())
146             else:
147                 print(filename,"is not exist")
148
149     def cmd_get(self,*args):
150         cmd_split = args[0].split()
151         if len(cmd_split) > 1:
152             filename = cmd_split[1]
153             msg_dic = {
154                 "action":cmd_split[0],
155                 "filename":filename,
156                 "size":0,
157                 "overridden":True
158             }
159
160             if os.path.isfile(filename):
161                 print("文件已存在")
162                 old_size = os.stat(filename).st_size
163                 msg_dic["size"] = old_size
164             else:
165                 print("文件不存在")
166                 old_size = 0
167                 msg_dic["size"] = old_size
168
169             self.client.send(json.dumps(msg_dic).encode("utf-8"))
170             #防止粘包等服务器确认
171             data = self.client.recv(1024)
172             server_response = json.loads(data.decode())
173
174             if server_response["filename"] is not None:
175                 file_name = server_response["filename"]
176                 if old_size>=server_response["size"]:
177                     print("文件已下载完毕!")        #文件已下载完毕
178                     received_size = old_size
179                 else:
180                     f = open(filename, ‘ab‘)
181                     received_size = old_size
182                 self.client.send(b"ok")
183                 while received_size < server_response["size"]:
184                     if server_response["size"] - received_size >= 1024: #此时要收不只一次
185                         size = 1024
186                     else:   #最后一次收的数据大小,防止多收,避免粘包
187                         size = server_response["size"] - received_size
188                     data = self.client.recv(1024)
189                     received_size += len(data)  #每次收到的大小
190                     f.write(data)
191                     cur_percent = received_size / server_response["size"] * 100
192                     self.show_progress(server_response["size"],received_size,cur_percent)   #显示进度条
193                 print("下载成功!")
194             else:
195                 print("文件不存在!")
196
197     def show_progress(self,total,finished,percent):
198         progress_mark = "=" * int(percent/2)
199         sys.stdout.write("[%s/%s]%s>%s\r" %(total,finished,progress_mark,percent))
200         sys.stdout.flush()
201         if percent == 100:
202             print (‘\n‘)
203
204     def help(self):
205         msg = ‘‘‘
206      ---命令菜单---
207         dir
208         mkdir filename
209         rmdir filename
210         cd filename
211         get filename
212         put filename
213         ‘‘‘
214         print(msg)
215
216 ftp = FtpClient("localhost",9999)

ftp_client

ftp_server

 1 accounts = {
 2     ‘zz‘: {‘passwd‘: "123",
 3              ‘quotation‘: 100000000,
 4              ‘home‘: ‘home/zz‘
 5              },
 6     ‘jj‘:{‘passwd‘: "123",
 7              ‘quotation‘: 1000000,
 8              ‘home‘: ‘home/jj‘
 9              },
10 }

user_data

四、效果展示

1、用户登陆认证:

2、多用户同时登录

3、不同用户家目录不同

4、查看目录下文件

5、在家目录下切换目录

6、在家目录下任意目录里创建目录

7、删除目录或文件

8、用户磁盘配额

9、上传:支持断点续传

10、下载:支持断点续传和进度条显示

原文地址:https://www.cnblogs.com/hy0822/p/9224571.html

时间: 2024-11-14 10:33:35

Python 程序:ftp的相关文章

Eclipse+python的安装与使用(详细阐述了eclipse编写Python程序的基本功能及技巧)

安装环境说明: 操作系统:win7 JDK:jdk1.7.0_11 下载网址:http://www.oracle.com/technetwork/java/javase/downloads/index.html Eclipse:eclipse-jee-kepler-SR2-win32-x86_64 下载网址: http://www.eclipse.org/downloads/ http://www.eclipse.org/downloads/download.php?file=/technolo

Python征途-02.第一个Python程序

上一章介绍了Python的相关知识,本章就开始着手操作,创建我们的第一个Python程序,首先需要配置好Python的运行环境 1.python环境准备 1.1.windows下安装 Windows10配置环境变量,防止程序调用出错 [右键此电脑]-->[属性]-->[高级系统设置]-->[高级]-->[环境变量]-->[在系统变量栏里,选中变量名Path,进行编辑] --> [将Python安装目录追加到变量值中,用 : 分割] 如:我的路径为D:\Program F

python day8 FTP 作业

目录如下: (python3 程序) github地址如下:   https://github.com/liang2580/FTP2 [[email protected] ~]# tree FTP2/FTP2/ ├── FTPClient │   ├── 123 │   ├── ftp_client.py ###客户端程序 启动程序 │   ├── __init__.py │   ├── liang │   └── te ├── FTPServer │   ├── bin │   │   ├──

python实现FTP弱口令扫描器与简单端口扫描器

python实现FTP弱口令扫描器与简单端口扫描器 目录 FTP弱口令扫描器 简单端口扫描器 参考: https://blog.csdn.net/rebelqsp/article/details/22109925 https://www.aliyun.com/jiaocheng/434055.html?spm=5176.100033.2.10.3571581eheCuHX FTP弱口令扫描器 # Ftp匿名扫描器的实现,需要使用FTP这个类 # Ftp这个类实现了Ftp客户端的大多数功能,比如连

推荐Python程序员进阶阅读的书籍(2015版)

列一下自己过去一年阅读的Python相关书籍,评论是在本人阅读完书籍并完成书中所有测试用例的基础上编写的: <Python Cookbook 3rd>5星 ,绝对值得阅读!直接看英文版吧,中文翻译的如何不太清楚.对于高手就当是复习功课了,总有一些地方记得不是很清楚. <Cython - A Guide for Python Programmers> 5星 by Kurt W. Smith, O'Reilly 2015 如果你想封装一个C的库,或者别人封装的C库在你的平台下不能够使用

python程序打包成.exe

1. 安装py2exe 2. 将打包文件与被打包文件放在同一个文件夹下. 例如,你需要将test.py打包成exe,那么test.py就是被打包文件,那么打包文件呢,写一个setup.py文件,内容如下: # setup.pyfrom distutils.core import setupimport py2exesetup(console=["test.py"]) 放在同一个目录的目的是因为在console = ["test.py"]时,不用考虑路径问题,注意,你

python程序之profile分析

操作系统 : CentOS7.3.1611_x64 python版本:2.7.5 问题描述 1.Python开发的程序在使用过程中很慢,想确定下是哪段代码比较慢: 2.Python开发的程序在使用过程中占用内存很大,想确定下是哪段代码引起的: 解决方案 使用profile分析分析cpu使用情况 profile介绍: https://docs.python.org/2/library/profile.html 可以使用profile和cProfile对python程序进行分析,这里主要记录下cPr

Python程序员糟糕的一天

Python程序员糟糕的一天!! 第一张图是上午上班前,第二张图是下午下班前,一天下来就加了一个return! 为了方便你们看懂具体(主要)的改动,我加了第三张图(上班前)和第四张图(下班前). 第一张图(因图片显示不完整而看不清楚的,请在"在新标签页中打开图片"): 第二张图: 第三张图: 第四张图: 上班前代码: #!/usr/bin/python # encoding: utf-8 # -*- coding: utf8 -*- """ Created

3. 第一个python程序

学习任何一门语言的第一步,首先要写个'hello world',这算是程序员的一个传统.但在写之前,还有注意几个问题. 首先,python是一门脚本语言,而脚本语言的特点就是:我们写的代码会先由解释器进行编译以后,再去执行.但是当我们的程序运行在操作系统之上时,系统并没有那么智能,能够自动识别出我们要用哪个解释器去解释我们的代码(windows则通过后缀名关联执行程序,所以不用声明也可以,但是我们的代码更多在linux上运行,所以解释器的声明算是必须的),所以,我们必须要声明我们的解释器是什么.