转载请注明出处!

功能介绍:

可执行的命令:

  1. ls
    pwd
    cd
    put
    rm
    get
    mkdir

1、用户加密认证

2、允许多用户同时登陆

3、每个用户有自己的家目录,且只可以访问自己的家目录

4、运行在自己家目录下随意切换目录

5、允许上传下载文件,且文件一致

6、传输过程中显示进度条

server main 代码:

  1. # Author by Andy
  2. # _*_ coding:utf-8 _*_
  3. import os, sys, json, hashlib, socketserver, time
  4.  
  5. base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  6. sys.path.append(base_dir)
  7. from conf import userdb_set
  8. class Ftp_server(socketserver.BaseRequestHandler):
  9. user_home_dir = ''
  10. def auth(self, *args):
  11. '''验证用户名及密码'''
  12. cmd_dic = args[0]
  13. username = cmd_dic["username"]
  14. password = cmd_dic["password"]
  15. f = open(userdb_set.userdb_set(), 'r')
  16. user_info = json.load(f)
  17. if username in user_info.keys():
  18. if password == user_info[username]:
  19. self.request.send(''.encode())
  20. os.chdir('/home/%s' % username)
  21. self.user_home_dir = os.popen('pwd').read().strip()
  22. data = "%s login successed" % username
  23. self.loging(data)
  24. else:
  25. self.request.send(''.encode())
  26. data = "%s login failed" % username
  27. self.loging(data)
  28. f.close
  29. else:
  30. self.request.send(''.encode())
  31. data = "%s login failed" % username
  32. self.loging(data)
  33. f.close
  34. ###################################################################################################
  35.  
  36. def get(self, *args):
  37. '''给客户端传输文件'''
  38. request_code = {
  39. '': 'file is ready to get',
  40. '': 'file not found!'
  41. }
  42. cmd_dic = args[0]
  43. self.loging(json.dumps(cmd_dic))
  44. filename = cmd_dic["filename"]
  45. if os.path.isfile(filename):
  46. self.request.send(''.encode('utf-8')) # 确认文件存在
  47. self.request.recv(1024)
  48. self.request.send(str(os.stat(filename).st_size).encode('utf-8'))
  49. self.request.recv(1024)
  50. m = hashlib.md5()
  51. f = open(filename, 'rb')
  52. for line in f:
  53. m.update(line)
  54. self.request.send(line)
  55. self.request.send(m.hexdigest().encode('utf-8'))
  56. print('From server:Md5 value has been sended!')
  57. f.close()
  58. else:
  59. self.request.send(''.encode('utf-8'))
  60. ###################################################################################################
  61.  
  62. def cd(self, *args):
  63. '''执行cd命令'''
  64. user_current_dir = os.popen('pwd').read().strip()
  65. cmd_dic = args[0]
  66. self.loging(json.dumps(cmd_dic))
  67. path = cmd_dic['path']
  68. if path.startswith('/'):
  69. if self.user_home_dir in path:
  70. os.chdir(path)
  71. new_dir = os.popen('pwd').read()
  72. user_current_dir = new_dir
  73. self.request.send('Change dir successfully!'.encode("utf-8"))
  74. data = 'Change dir successfully!'
  75. self.loging(data)
  76. elif os.path.exists(path):
  77. self.request.send('Permission Denied!'.encode("utf-8"))
  78. data = 'Permission Denied!'
  79. self.loging(data)
  80. else:
  81. self.request.send('Directory not found!'.encode("utf-8"))
  82. data = 'Directory not found!'
  83. self.loging(data)
  84. elif os.path.exists(path):
  85. os.chdir(path)
  86. new_dir = os.popen('pwd').read().strip()
  87. if self.user_home_dir in new_dir:
  88. self.request.send('Change dir successfully!'.encode("utf-8"))
  89. user_current_dir = new_dir
  90. data = 'Change dir successfully!'
  91. self.loging(data)
  92. else:
  93. os.chdir(user_current_dir)
  94. self.request.send('Permission Denied!'.encode("utf-8"))
  95. data = 'Permission Denied!'
  96. self.loging(data)
  97. else:
  98. self.request.send('Directory not found!'.encode("utf-8"))
  99. data = 'Directory not found!'
  100. self.loging(data)
  101. ###################################################################################################
  102.  
  103. def rm(self, *args):
  104. request_code = {
  105. '': 'file exist,and Please confirm whether to rm',
  106. '': 'file not found!'
  107. }
  108. cmd_dic = args[0]
  109. self.loging(json.dumps(cmd_dic))
  110. filename = cmd_dic['filename']
  111. if os.path.exists(filename):
  112. self.request.send(''.encode("utf-8")) # 确认文件存在
  113. client_response = self.request.recv(1024).decode()
  114. if client_response == '':
  115. os.popen('rm -rf %s' % filename)
  116. self.request.send(('File %s has been deleted!' % filename).encode("utf-8"))
  117. self.loging('File %s has been deleted!' % filename)
  118. else:
  119. self.request.send(('File %s not deleted!' % filename).encode("utf-8"))
  120. self.loging('File %s not deleted!' % filename)
  121. else:
  122. self.request.send(''.encode("utf-8"))
  123. ###################################################################################################
  124.  
  125. def pwd(self, *args):
  126. '''执行pwd命令'''
  127. cmd_dic = args[0]
  128. self.loging(json.dumps(cmd_dic))
  129. server_response = os.popen('pwd').read().strip().encode("utf-8")
  130. self.request.send(server_response)
  131.  
  132. ###################################################################################################
  133. def ls(self, *args):
  134. '''执行ls命名'''
  135. cmd_dic = args[0]
  136. self.loging(json.dumps(cmd_dic))
  137. path = cmd_dic['path']
  138. cmd = 'ls -l %s' % path
  139. server_response = os.popen(cmd).read().encode("utf-8")
  140. self.request.send(server_response)
  141.  
  142. ###################################################################################################
  143. def put(self, *args):
  144. '''接收客户端文件'''
  145. cmd_dic = args[0]
  146. self.loging(json.dumps(cmd_dic))
  147. filename = cmd_dic["filename"]
  148. filesize = cmd_dic["size"]
  149. if os.path.isfile(filename):
  150. f = open(filename + '.new', 'wb')
  151. else:
  152. f = open(filename, 'wb')
  153. request_code = {
  154. '': 'Ready to recceive data!',
  155. '': 'Not ready to received data!'
  156. }
  157. self.request.send(''.encode())
  158. receive_size = 0
  159. while True:
  160. if receive_size < filesize:
  161. data = self.request.recv(1024)
  162. f.write(data)
  163. receive_size += len(data)
  164. else:
  165. data = "File %s has been uploaded successfully!" % filename
  166. self.loging(data)
  167. print(data)
  168. break
  169.  
  170. ###################################################################################################
  171.  
  172. def mkdir(self, *args):
  173. request_code = {
  174. '': 'Directory has been made!',
  175. '': 'Directory is aleady exist!'
  176. }
  177. cmd_dic = args[0]
  178. self.loging(json.dumps(cmd_dic))
  179. dir_name = cmd_dic['dir_name']
  180. if os.path.exists(dir_name):
  181. self.request.send(''.encode("utf-8"))
  182. else:
  183. os.popen('mkdir %s' % dir_name)
  184. self.request.send(''.encode("utf-8"))
  185.  
  186. ###################################################################################################
  187.  
  188. def loging(self, data):
  189. '''日志记录'''
  190. localtime = time.asctime(time.localtime(time.time()))
  191. log_file = '/root/ftp/ftpserver/log/server.log'
  192. with open(log_file, 'a', encoding='utf-8') as f:
  193. f.write('%s-->' % localtime + data + '\n')
  194. ###################################################################################################
  195.  
  196. def handle(self):
  197. # print("您本次访问使用的IP为:%s" %self.client_address[0])
  198. # localtime = time.asctime( time.localtime(time.time()))
  199. # print(localtime)
  200.  
  201. while True:
  202. try:
  203. self.data = self.request.recv(1024).decode() #
  204. # print(self.data)
  205. cmd_dic = json.loads(self.data)
  206. action = cmd_dic["action"]
  207. # print("用户请求%s"%action)
  208. if hasattr(self, action):
  209. func = getattr(self, action)
  210. func(cmd_dic)
  211. except Exception as e:
  212. self.loging(str(e))
  213. break
  214.  
  215. def run():
  216. HOST, PORT = '0.0.0.0', 6969
  217. print("The server is started,and listenning at port 6969")
  218. server = socketserver.ThreadingTCPServer((HOST, PORT), Ftp_server)
  219. server.serve_forever()
  220. if __name__ == '__main__':
  221. run()

设置用户口令代码:

  1. #Author by Andy
  2. #_*_ coding:utf-8 _*_
  3. import os,json,hashlib,sys
  4.  
  5. base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  6. userdb_file = base_dir+"\data\\userdb"
  7. # print(userdb_file)
  8. def userdb_set():
  9. if os.path.isfile(userdb_file):
  10. # print(userdb_file)
  11. return userdb_file
  12. else:
  13. print('请先为您的服务器创建用户!')
  14. user_data = {}
  15. dict={}
  16. Exit_flags = True
  17. while Exit_flags:
  18. username = input("Please input username:")
  19. if username != 'exit':
  20. password = input("Please input passwod:")
  21. if password != 'exit':
  22. user_data.update({username:password})
  23. m = hashlib.md5()
  24. # m.update('hello')
  25. # print(m.hexdigest())
  26. for i in user_data:
  27. # print(i,user_data[i])
  28. m.update(user_data[i].encode())
  29. dict.update({i:m.hexdigest()})
  30. else:
  31. break
  32. else:
  33. break
  34. f = open(userdb_file,'w')
  35. json.dump(dict,f)
  36. f.close()
  37. 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. 8.xpath(dom4j支持的jar)

    1.使用dom4j支持xpath的操作(xpath可以直接获取到某个元素) (1)第一种形式 /AAA/DDD/BBB:表示一层一层的,AAA下面DDD下面的BBB元素 (2)第二种形式 //BBB: ...

  2. 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 ...

  3. vue工程本地代码请求http发生跨域提示错误解决方法

    这个可以使用代理进行跨域,这样看来跨域的方法就有几种了,对于iframe中的用postmassage,对于vue工程中的跨域则使用代理模式. 代理模式配置如下: 在config文件夹下找到index. ...

  4. AcWing 257. 关押罪犯 (并查集)打卡

    题目:https://www.acwing.com/problem/content/description/259/ 题意:有两个监狱,监狱里面有很多犯人,现在有很多对冲突,还有个冲突值,现在问我们怎 ...

  5. Scrapy模拟登陆豆瓣抓取数据

    scrapy  startproject douban 其中douban是我们的项目名称 2创建爬虫文件 进入到douban 然后创建爬虫文件 scrapy genspider dou douban. ...

  6. vector代替数组

    vector代替数组 1.声明一个int向量以替代一维的数组:vector <int> a;(等于声明了一个int数组a[],大小没有指定,可以动态的向里面添加删除). 2.用vector ...

  7. tarjan复习笔记

    tarjan复习笔记 (关于tarjan读法,优雅一点读塔洋,接地气一点读塔尖) 0. 连通分量 有向图: 强连通分量(SCC)是个啥 就是一张图里面两个点能互相达到,那么这两个点在同一个强连通分量里 ...

  8. 单例模式@Singleton在测试中的运用

    前言 单例模式是一种比较常用的设计模式,目的是:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 测试种可能用到的场景 : 在很多时候,有些对象我们希望在整个程序只有一个实例,如线程池.数据库连 ...

  9. python unittest 之mock

    1.什么是mockunittest.mock是一个用于在Python中进行单元测试的库,Mock翻译过来就是模拟的意思,顾名思义这个库的主要功能是模拟一些东西.它的主要功能是使用mock对象替代掉指定 ...

  10. idea中以maven工程的方式运行tomcat源码

    0. 准备环境 idea+jdk8+tomcat源码 1.下载tomcat源码: http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/ ...