python3 实现简单ftp服务功能(服务端 For Linux)
转载请注明出处!
功能介绍:
可执行的命令:
- ls
pwd
cd
put
rm
get
mkdir
1、用户加密认证
2、允许多用户同时登陆
3、每个用户有自己的家目录,且只可以访问自己的家目录
4、运行在自己家目录下随意切换目录
5、允许上传下载文件,且文件一致
6、传输过程中显示进度条
server main 代码:
- # Author by Andy
- # _*_ coding:utf-8 _*_
- import os, sys, json, hashlib, socketserver, time
- base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
- sys.path.append(base_dir)
- from conf import userdb_set
- class Ftp_server(socketserver.BaseRequestHandler):
- user_home_dir = ''
- def auth(self, *args):
- '''验证用户名及密码'''
- cmd_dic = args[0]
- username = cmd_dic["username"]
- password = cmd_dic["password"]
- f = open(userdb_set.userdb_set(), 'r')
- user_info = json.load(f)
- if username in user_info.keys():
- if password == user_info[username]:
- self.request.send(''.encode())
- os.chdir('/home/%s' % username)
- self.user_home_dir = os.popen('pwd').read().strip()
- data = "%s login successed" % username
- self.loging(data)
- else:
- self.request.send(''.encode())
- data = "%s login failed" % username
- self.loging(data)
- f.close
- else:
- self.request.send(''.encode())
- data = "%s login failed" % username
- self.loging(data)
- f.close
- ###################################################################################################
- def get(self, *args):
- '''给客户端传输文件'''
- request_code = {
- '': 'file is ready to get',
- '': 'file not found!'
- }
- cmd_dic = args[0]
- self.loging(json.dumps(cmd_dic))
- filename = cmd_dic["filename"]
- if os.path.isfile(filename):
- self.request.send(''.encode('utf-8')) # 确认文件存在
- self.request.recv(1024)
- self.request.send(str(os.stat(filename).st_size).encode('utf-8'))
- self.request.recv(1024)
- m = hashlib.md5()
- f = open(filename, 'rb')
- for line in f:
- m.update(line)
- self.request.send(line)
- self.request.send(m.hexdigest().encode('utf-8'))
- print('From server:Md5 value has been sended!')
- f.close()
- else:
- self.request.send(''.encode('utf-8'))
- ###################################################################################################
- def cd(self, *args):
- '''执行cd命令'''
- user_current_dir = os.popen('pwd').read().strip()
- cmd_dic = args[0]
- self.loging(json.dumps(cmd_dic))
- path = cmd_dic['path']
- if path.startswith('/'):
- if self.user_home_dir in path:
- os.chdir(path)
- new_dir = os.popen('pwd').read()
- user_current_dir = new_dir
- self.request.send('Change dir successfully!'.encode("utf-8"))
- data = 'Change dir successfully!'
- self.loging(data)
- elif os.path.exists(path):
- self.request.send('Permission Denied!'.encode("utf-8"))
- data = 'Permission Denied!'
- self.loging(data)
- else:
- self.request.send('Directory not found!'.encode("utf-8"))
- data = 'Directory not found!'
- self.loging(data)
- elif os.path.exists(path):
- os.chdir(path)
- new_dir = os.popen('pwd').read().strip()
- if self.user_home_dir in new_dir:
- self.request.send('Change dir successfully!'.encode("utf-8"))
- user_current_dir = new_dir
- data = 'Change dir successfully!'
- self.loging(data)
- else:
- os.chdir(user_current_dir)
- self.request.send('Permission Denied!'.encode("utf-8"))
- data = 'Permission Denied!'
- self.loging(data)
- else:
- self.request.send('Directory not found!'.encode("utf-8"))
- data = 'Directory not found!'
- self.loging(data)
- ###################################################################################################
- def rm(self, *args):
- request_code = {
- '': 'file exist,and Please confirm whether to rm',
- '': 'file not found!'
- }
- cmd_dic = args[0]
- self.loging(json.dumps(cmd_dic))
- filename = cmd_dic['filename']
- if os.path.exists(filename):
- self.request.send(''.encode("utf-8")) # 确认文件存在
- client_response = self.request.recv(1024).decode()
- if client_response == '':
- os.popen('rm -rf %s' % filename)
- self.request.send(('File %s has been deleted!' % filename).encode("utf-8"))
- self.loging('File %s has been deleted!' % filename)
- else:
- self.request.send(('File %s not deleted!' % filename).encode("utf-8"))
- self.loging('File %s not deleted!' % filename)
- else:
- self.request.send(''.encode("utf-8"))
- ###################################################################################################
- def pwd(self, *args):
- '''执行pwd命令'''
- cmd_dic = args[0]
- self.loging(json.dumps(cmd_dic))
- server_response = os.popen('pwd').read().strip().encode("utf-8")
- self.request.send(server_response)
- ###################################################################################################
- def ls(self, *args):
- '''执行ls命名'''
- cmd_dic = args[0]
- self.loging(json.dumps(cmd_dic))
- path = cmd_dic['path']
- cmd = 'ls -l %s' % path
- server_response = os.popen(cmd).read().encode("utf-8")
- self.request.send(server_response)
- ###################################################################################################
- def put(self, *args):
- '''接收客户端文件'''
- cmd_dic = args[0]
- self.loging(json.dumps(cmd_dic))
- filename = cmd_dic["filename"]
- filesize = cmd_dic["size"]
- if os.path.isfile(filename):
- f = open(filename + '.new', 'wb')
- else:
- f = open(filename, 'wb')
- request_code = {
- '': 'Ready to recceive data!',
- '': 'Not ready to received data!'
- }
- self.request.send(''.encode())
- receive_size = 0
- while True:
- if receive_size < filesize:
- data = self.request.recv(1024)
- f.write(data)
- receive_size += len(data)
- else:
- data = "File %s has been uploaded successfully!" % filename
- self.loging(data)
- print(data)
- break
- ###################################################################################################
- def mkdir(self, *args):
- request_code = {
- '': 'Directory has been made!',
- '': 'Directory is aleady exist!'
- }
- cmd_dic = args[0]
- self.loging(json.dumps(cmd_dic))
- dir_name = cmd_dic['dir_name']
- if os.path.exists(dir_name):
- self.request.send(''.encode("utf-8"))
- else:
- os.popen('mkdir %s' % dir_name)
- self.request.send(''.encode("utf-8"))
- ###################################################################################################
- def loging(self, data):
- '''日志记录'''
- localtime = time.asctime(time.localtime(time.time()))
- log_file = '/root/ftp/ftpserver/log/server.log'
- with open(log_file, 'a', encoding='utf-8') as f:
- f.write('%s-->' % localtime + data + '\n')
- ###################################################################################################
- def handle(self):
- # print("您本次访问使用的IP为:%s" %self.client_address[0])
- # localtime = time.asctime( time.localtime(time.time()))
- # print(localtime)
- while True:
- try:
- self.data = self.request.recv(1024).decode() #
- # print(self.data)
- cmd_dic = json.loads(self.data)
- action = cmd_dic["action"]
- # print("用户请求%s"%action)
- if hasattr(self, action):
- func = getattr(self, action)
- func(cmd_dic)
- except Exception as e:
- self.loging(str(e))
- break
- def run():
- HOST, PORT = '0.0.0.0', 6969
- print("The server is started,and listenning at port 6969")
- server = socketserver.ThreadingTCPServer((HOST, PORT), Ftp_server)
- server.serve_forever()
- if __name__ == '__main__':
- run()
设置用户口令代码:
- #Author by Andy
- #_*_ coding:utf-8 _*_
- import os,json,hashlib,sys
- base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
- userdb_file = base_dir+"\data\\userdb"
- # print(userdb_file)
- def userdb_set():
- if os.path.isfile(userdb_file):
- # print(userdb_file)
- return userdb_file
- else:
- print('请先为您的服务器创建用户!')
- user_data = {}
- dict={}
- Exit_flags = True
- while Exit_flags:
- username = input("Please input username:")
- if username != 'exit':
- password = input("Please input passwod:")
- if password != 'exit':
- user_data.update({username:password})
- m = hashlib.md5()
- # m.update('hello')
- # print(m.hexdigest())
- for i in user_data:
- # print(i,user_data[i])
- m.update(user_data[i].encode())
- dict.update({i:m.hexdigest()})
- else:
- break
- else:
- break
- f = open(userdb_file,'w')
- json.dump(dict,f)
- f.close()
- return userdb_file
目录结构:
python3 实现简单ftp服务功能(服务端 For Linux)的更多相关文章
- python3 实现简单ftp服务功能(客户端)
转载请注明出处! 可执行的命令: lspwdcd put rm get mkdir 上传下载,显示进度百分比以及平均上传下载速度 客户端 main代码: #Author by Andy #_*_ co ...
- Python3实现简单的爬虫功能
python3简单实现一个爬去网站图片的小功能: 有时候想要下载自己喜欢的多个图片时,不需要一个个点击来下载,使用python脚本批量拉取,并保存到本地. 1. 首先找到自己要下载图片的url 2. ...
- 简单 TCP/IP 服务功能
本主题使用每台 Windows 计算机上提供的 Echo 和 Quote of the Day 服务.在所有 Windows 版本中都提供了简单 TCP/IP 服务功能.该功能会提供了以下服务:Cha ...
- Python实现FTP服务功能
本文从以下三个方面, 阐述Python如何搭建FTP服务器 一. Python搭建FTP服务器 二. FTP函数释义 三. 查看目录结构 四. 上传下载程序 一. Python搭建FTP服务器 1. ...
- Glue4Net简单部署基于win服务的Socket程序
smark 专注于高并发网络和大型网站架规划设计,提供.NET平台下高吞吐的网络通讯应用技术咨询和支持 Glue4Net简单部署基于win服务的Socket程序 在写一些服务应用的时候经常把要它部署到 ...
- crtmp Server 开启rtsp服务功能
Crtmp Server 包含了rtsp 服务功能,如果需要一个简单轻量的rtsp服务,Crtmp Server会是不错的选择. 默认情况下,rtsp功能是关闭的,需要在配置文件中打开.window环 ...
- 简单Spring Cloud 微服务框架搭建
微服务是现在比较流行的技术,对于程序猿而言,了解并搭建一个基本的微服务框架是很有必要滴. 微服务包含的内容非常多,一般小伙伴们可以根据自己的需求不断添加各种组件.框架. 一般情况下,基本的微服务框架包 ...
- FTP 文件传输服务
昨晚心血来潮,尝试用python写了一个ftp文件传输服务,可以接收指令,从远程ftp服务器同步指定目录数据,最后没用上,开源出来. https://github.com/jadepeng/ftp_t ...
- FTP文件传输服务
FTP文件传输服务 一 .FTP 连接及传输的模式 l 控制连接:TCP21,用于发送FTP命令信息. l 数据连接:TCP 20, 用于上传下载数据. · 数据连接建立的类型: ·主动模式: 服 ...
随机推荐
- 8.xpath(dom4j支持的jar)
1.使用dom4j支持xpath的操作(xpath可以直接获取到某个元素) (1)第一种形式 /AAA/DDD/BBB:表示一层一层的,AAA下面DDD下面的BBB元素 (2)第二种形式 //BBB: ...
- chromedriver与chrome版本映射表(更新至v2.46)
chromedriver版本 支持的Chrome版本 v2.46 v71-73 v2.45 v70-72 v2.44 v69-71 v2.43 v69-71 v2.42 v68-70 v2.41 v6 ...
- vue工程本地代码请求http发生跨域提示错误解决方法
这个可以使用代理进行跨域,这样看来跨域的方法就有几种了,对于iframe中的用postmassage,对于vue工程中的跨域则使用代理模式. 代理模式配置如下: 在config文件夹下找到index. ...
- AcWing 257. 关押罪犯 (并查集)打卡
题目:https://www.acwing.com/problem/content/description/259/ 题意:有两个监狱,监狱里面有很多犯人,现在有很多对冲突,还有个冲突值,现在问我们怎 ...
- Scrapy模拟登陆豆瓣抓取数据
scrapy startproject douban 其中douban是我们的项目名称 2创建爬虫文件 进入到douban 然后创建爬虫文件 scrapy genspider dou douban. ...
- vector代替数组
vector代替数组 1.声明一个int向量以替代一维的数组:vector <int> a;(等于声明了一个int数组a[],大小没有指定,可以动态的向里面添加删除). 2.用vector ...
- tarjan复习笔记
tarjan复习笔记 (关于tarjan读法,优雅一点读塔洋,接地气一点读塔尖) 0. 连通分量 有向图: 强连通分量(SCC)是个啥 就是一张图里面两个点能互相达到,那么这两个点在同一个强连通分量里 ...
- 单例模式@Singleton在测试中的运用
前言 单例模式是一种比较常用的设计模式,目的是:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 测试种可能用到的场景 : 在很多时候,有些对象我们希望在整个程序只有一个实例,如线程池.数据库连 ...
- python unittest 之mock
1.什么是mockunittest.mock是一个用于在Python中进行单元测试的库,Mock翻译过来就是模拟的意思,顾名思义这个库的主要功能是模拟一些东西.它的主要功能是使用mock对象替代掉指定 ...
- idea中以maven工程的方式运行tomcat源码
0. 准备环境 idea+jdk8+tomcat源码 1.下载tomcat源码: http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/ ...