设为首页 收藏本站
查看: 1899|回复: 0

[经验分享] python模拟简单ftp

[复制链接]

尚未签到

发表于 2018-8-7 13:36:12 | 显示全部楼层 |阅读模式
  需求:开发简单的FTP


  • 用户登陆
  • 上传/下载文件
  • 不同用户家目录不同
  • 查看当前目录下文件
  • 充分使用面向对象知识  代码目录结构:
    DSC0000.jpg

      流程图:
    DSC0001.jpg

      客户端代码:
      

      
    import os,sys
      
    import getpass
      
    import platform
      
    if platform.system() == "Windows":
      
    BASE_DIR = "\\".join(os.path.abspath(os.path.dirname(__file__)).split("\\")[:-1])
      
    else:
      
    BASE_DIR = "/".join(os.path.abspath(os.path.dirname(__file__)).split("/")[:-1])
      
    sys.path.insert(0,BASE_DIR)
      
    from modules import ssh

  #print(sys.path)
  if name == "main":
  #host = input("请输入服务器端IP:").strip()
  #port = input("请输入端口:").strip()
  username = input("请输入用户名:").strip()
  password = input("请输入密码:").strip()
  #password = getpass.getpass("请输入密码:").strip()
  ssh.SSH("host","port",username,password)
  

服务端代码:  

  import os,sys
  import socket
  import platform
  if platform.system() == "Windows":
  BASE_DIR = "\".join(os.path.abspath(os.path.dirname(file)).split("\")[:-1])
  else:
  BASE_DIR = "/".join(os.path.abspath(os.path.dirname(file)).split("/")[:-1])
  sys.path.insert(0,BASE_DIR)
  from modules import ftp
  #从文件获取用户账号信息
  def get_acount():
  acount_dict = {}
  f = open(BASE_DIR+"\conf\acount.conf")
  for account in f:
  acount_dict[account.split()[0]] = account.split()[1]
  return acount_dict
  if name == "main":
  server = socket.socket()
  server.bind(("localhost",10620))
  server.listen(5)
  print("准备接受连接.....")
  while True:
  conn, addr = server.accept()
  auth = conn.recv(1024)
  username = auth.decode("utf-8").split()[0]
  password = auth.decode("utf-8").split()[1]
  acount = get_acount()
  if username in acount and password == acount[username]:
  conn.send(b"success")
  if os.path.exists(("C:\Users\%s" %username)):
  home_dir = "C:\Users\%s" %username
  conn.send(home_dir.encode("utf-8"))
  else:
  os.mkdir("C:\Users\%s" %username)
  conn.send(home_dir)
  os.chdir(home_dir)
  conn.send("登录成功!命令帮助请输入h或?".encode("utf-8"))
  help = '''
  put [file_name]  上传本地文件到ftp服务器。例如:put file.txt
  get [file_name]  下载ftp服务器文件到本地。例如:get file.txt
  command 执行操作系统命令。例如:dir  ipconfig
  quit|exit|q 退出登录。例如:q
  '''
  while True:
  command = conn.recv(1024).decode("utf-8")
  if command == "?" or command == "h":
  conn.send(help.encode("utf-8"))
  elif command.split()[0] == "get":# or command.split()[0] == "put":  #判断用户是否执行ftp命令
  if len(command.split()) != 2:
  conn.send(("%s命令格式为:%s FileName" %(command.split()[0],command.split()[0])).encode("utf-8"))
  continue
  else:
  Ftp = ftp.FTP(conn,command.split()[0],command.split()[1])  #调用FTP模块传输文件
  Ftp.download()
  elif command.split()[0] == "put":  # 判断用户是否执行ftp命令
  f = open(command.split()[1], "wb")
  fsize = conn.recv(1024).decode("utf-8")
  conn.send(b"ok")
  while True:
  data = conn.recv(102400)
  f.write(data)
  f.flush()
  if os.path.getsize(command.split()[1]) == int(fsize):
  break
  f.close()
  elif command == "q" or command == "quit" or command == "exit":
  conn.send("q".encode("utf-8"))
  conn.close()
  break
  else:
  res = os.popen(command).read()
  if len(res) == 0:  #如果是不存在的系统命令,则提醒用户输入错误
  conn.send(("%s:command not found" % command).encode("utf-8"))
  else: #以上条件都不符合后执行此步骤,此块内容为执行系统命令
  conn.sendall(res.encode("utf-8"))
  continue
  else:
  print(2222)
  conn.close()
  continue
  server.close()
  

ssh模块:  

  import os,sys
  import socket
  import platform
  if platform.system() == "Windows":
  BASE_DIR = "\".join(os.path.abspath(os.path.dirname(file)).split("\")[:-1])
  else:
  BASE_DIR = "/".join(os.path.abspath(os.path.dirname(file)).split("/")[:-1])
  sys.path.insert(0,BASE_DIR)
  from modules import ftp
  class SSH(object):
  def init(self,host,port,username,password):
  client = socket.socket()
  self.host = host
  self.port = port
  self.username = username
  self.password = password
  #client.connect((self.host,int(self.port)))
  client.connect(("localhost",10620))
  #登录时将账号发送到服务端进行验证,验证通过后进入循环命令输入
  #client.send((self.username+" "+self.password).encode("utf-8"))
  client.send(("zhaohh" + " " + "123").encode("utf-8"))
  auth_res = client.recv(1024)
  if auth_res.decode("utf-8") == "success":
  home_dir = client.recv(1024)  #获取用户登录成功后的家目录
  welcom = client.recv(1024)
  print(welcom.decode("utf-8"))
  while True:
  command = input("[%s]$ "%home_dir.decode("utf-8")).strip()
  if len(command) == 0:continue
  client.send(command.encode("utf-8"))
  if command.split()[0] == "get":
  f = open(command.split()[1],"wb")
  fsize = client.recv(1024).decode("utf-8")
  client.send(b"ok")
  while True:
  data = client.recv(102400)
  f.write(data)
  f.flush()
  if os.path.getsize(command.split()[1]) == int(fsize):
  break
  f.close()
  elif command.split()[0] == "put":
  if len(command.split()) != 2:
  print("%s命令格式为:%s FileName" % (command.split()[0], command.split()[0]))
  continue
  else:
  Ftp = ftp.FTP(client, command.split()[0], command.split()[1])  # 调用FTP模块传输文件
  Ftp.upload()
  else:
  res = client.recv(102400)
  if res.decode("utf-8") == "q":
  exit("已退出登录!")
  else:
  print(res.decode())
  else:
  input("账号错误!")
  

ftp模块:  

  import os
  class FTP(object):
  def init(self,conn,command,filename):
  self.command = command
  self.filename = filename
  self.conn = conn
  

#上传文件  
def upload(self):
  print("上传文件:%s" %self.filename)
  f = open(self.filename,"rb")
  data = f.read()
  fsize = os.path.getsize(self.filename)
  self.conn.send(str(fsize).encode("utf-8"))
  self.conn.recv(1024)
  self.conn.sendall(data)
  

  
#下载文件
  
def download(self):
  f = open(self.filename,"rb")
  data = f.read()
  fsize = os.path.getsize(self.filename)
  self.conn.send(str(fsize).encode("utf-8"))
  self.conn.recv(1024)
  self.conn.sendall(data)
  

  
用户账号文件内容格式:
  
zhaohh 123
  
alex 123

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-548291-1-1.html 上篇帖子: python---字符串 下篇帖子: 3.1Python运算符
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表