转载请注明出处!

功能介绍:

可执行的命令:

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)的更多相关文章

  1. python3 实现简单ftp服务功能(客户端)

    转载请注明出处! 可执行的命令: lspwdcd put rm get mkdir 上传下载,显示进度百分比以及平均上传下载速度 客户端 main代码: #Author by Andy #_*_ co ...

  2. Python3实现简单的爬虫功能

    python3简单实现一个爬去网站图片的小功能: 有时候想要下载自己喜欢的多个图片时,不需要一个个点击来下载,使用python脚本批量拉取,并保存到本地. 1. 首先找到自己要下载图片的url 2. ...

  3. 简单 TCP/IP 服务功能

    本主题使用每台 Windows 计算机上提供的 Echo 和 Quote of the Day 服务.在所有 Windows 版本中都提供了简单 TCP/IP 服务功能.该功能会提供了以下服务:Cha ...

  4. Python实现FTP服务功能

    本文从以下三个方面, 阐述Python如何搭建FTP服务器 一. Python搭建FTP服务器 二. FTP函数释义 三. 查看目录结构 四. 上传下载程序 一. Python搭建FTP服务器 1. ...

  5. Glue4Net简单部署基于win服务的Socket程序

    smark 专注于高并发网络和大型网站架规划设计,提供.NET平台下高吞吐的网络通讯应用技术咨询和支持 Glue4Net简单部署基于win服务的Socket程序 在写一些服务应用的时候经常把要它部署到 ...

  6. crtmp Server 开启rtsp服务功能

    Crtmp Server 包含了rtsp 服务功能,如果需要一个简单轻量的rtsp服务,Crtmp Server会是不错的选择. 默认情况下,rtsp功能是关闭的,需要在配置文件中打开.window环 ...

  7. 简单Spring Cloud 微服务框架搭建

    微服务是现在比较流行的技术,对于程序猿而言,了解并搭建一个基本的微服务框架是很有必要滴. 微服务包含的内容非常多,一般小伙伴们可以根据自己的需求不断添加各种组件.框架. 一般情况下,基本的微服务框架包 ...

  8. FTP 文件传输服务

    昨晚心血来潮,尝试用python写了一个ftp文件传输服务,可以接收指令,从远程ftp服务器同步指定目录数据,最后没用上,开源出来. https://github.com/jadepeng/ftp_t ...

  9. FTP文件传输服务

    FTP文件传输服务 一 .FTP 连接及传输的模式 l  控制连接:TCP21,用于发送FTP命令信息. l  数据连接:TCP 20, 用于上传下载数据. · 数据连接建立的类型: ·主动模式: 服 ...

随机推荐

  1. UML-六大关系

    六大关系 依赖关系:(只要是在类中使用到了对方就存在依赖关系) 泛化关系:就是继承关系,即依赖关系的特例 实现关系:依赖关系的特例 关联关系:类于类之间的关系,即依赖关系的特例(具有导航性:双向关系或 ...

  2. SQL server 2008 数据库优化常用脚本

    --查询某个数据库的连接数 select count(*) from Master.dbo.SysProcesses where dbid=db_id() --前名其他等待类型 * from sys. ...

  3. 第一次用angularJS做后台管理点滴

    很早以前就大概看过一点angualrjs,但是没有项目,一直没有进行下去,就是干巴巴的看着,过了一段时间发现什么也不记得了. 来yulebaby我的第一个后台管理是用easyui做的,做完那个以后发现 ...

  4. java 通过反射获取类属性结构,类方法,类父类及其泛型,类,接口和包

    首先自定义三个类 package reflection1; public interface MtInterface { void info(); } package reflection1; imp ...

  5. [CSP-S模拟测试]:字符消除2(hash+KMP)

    题目背景 生牛哥终于打通了“字符消除”,可是他又被它的续集难倒了. 题目传送门(内部题52) 输入格式 第一行$n$表示数据组书.接下来每行一个字符串.(只包含大写字母) 输出格式 每组数据输出一个$ ...

  6. python练习题之计算字符串中所有字符得和

    第二题:计算字符串中所有数字的和1.字符串中只有小写字母和数字2.数字可能连续,也可能不连续3.连续数字要当做一个数处s='1234adg3g11's1 = "" for i in ...

  7. Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) 解决方法

    可以通过如下命令来解决,具体就是先关闭服务器,然后再重启服务器: cd /etc/init.d sudo service mysql stop sudo service mysql start

  8. C# Self Injector into non managed process

    Hey all, I'm gonna explain you how make a self injecting program in C#.I hope you guys thinks its us ...

  9. JS-iframe高度自适应内容

    iframe:https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/iframe iframe 内容加载后不改变 使用:onload=&q ...

  10. redis 服务器端安装(三)

    redis 服务器端安装(三) Redis is an open source, BSD licensed, advanced key-value store. It is often referre ...