python socke ftp功能实现 shell命令,上传,下载

2023-05-16

python socke ftp功能实现 shell命令,上传,下载

网上教程多,但是都不全,只有下载代码
本人练习,附加了注释,帮助新人练习
一定要吃透socket来回仍包的原理
编写时,要2个脚本一起开工,才能理解包来回仍的逻辑

功能实现

1,执行shell命令
2,执行上传
3,执行下载

服务端

#coding=UTF-8
import socket                #导入socket类
import SocketServer,commands,os
#定义返回函数
def message( code ):
  print "------",code
def sendmessage(obj,code):
  obj.request.send(str( len(code) ))
  obj.request.send(code)    
class MyTCPHandler(SocketServer.BaseRequestHandler):
  def handle(self):
    print '已建立连接:', self.client_address
    while True:
      #接收消息
      cmd = self.request.recv(1024)
      #如果消息无,结束连接
      if not cmd:
        print 'Lost connection with', self.client_address
        break
      #执行cmd命令
      #cmd_result = commands.getstatusoutput(cmd)
      #打印接收的消息
      print cmd
      if ( cmd == "wqtest" ):
        cmd_result="login pass"
        self.request.send(str( len(cmd_result) ))
        self.request.send(cmd_result)
        #等待接收命令shell,put,get 
        while True:
          cmd = self.request.recv(1024)
          if not cmd:
            print 'Lost connection with', self.client_address
            break
          print cmd
          user_command=cmd.split()
          if ( user_command[0] == "shell" ):
            print "执行cmd命令"
            sendmessage(self,"执行cmd命令")
            cmd_result = commands.getstatusoutput(user_command[1])
            print "parameter2:",user_command[1]
            print "result len:",len(cmd_result)
            print "result 1:",cmd_result[0]
            print "result 2:",cmd_result[1]
            sendmessage(self,cmd_result[1])



          elif ( user_command[0] == "input" ):
            print "执行上传命令"
            sendmessage(self,"执行上传命令")
            #获取大小
            feedback = self.request.recv(100) 
            if ( feedback.startswith("ready") ):
              #接收大小
              file_size = int(feedback.split()[-1])
              #反馈服务器,已经准备好
              self.request.send("recv_ready")
              #循环接收
              recv_size = 0
              #本地创建文件s
              file_name = user_command[1]
              f = file(os.path.basename(file_name),'wb')
              print "--->",file_name
              while not file_size == recv_size:
                if file_size - recv_size > 1024:
                  data = self.request.recv(1024)
                  recv_size += len(data)
                else:
                  data = self.request.recv( file_size - recv_size )
                  recv_size += ( file_size - recv_size )
                #接收就写入
                f.write(data)
                print file_size,recv_size
              print "get %s done" % file_name




          elif ( user_command[0] == "get" ):
            print "执行下载命令"
            #sendmessage(self,"执行下载命令")
            #获取文件名
            file_name = user_command[1]
            print "client wants to download file:", user_command[1]
            #判断文件是否存在
            if ( os.path.isfile( user_command[1] ) ):
              print "pass"
              file_size = os.path.getsize(user_command[1])
              #发送文件大小
              res = "ready %s" % file_size
            else:
              #发送文件大小
              print "faile"
              res = "file doesn't exist"
            print '---->',res 
            sendmessage(self,res)
            #等待回话,结果,不直接发送,是为了避免粘包
            print feedback
            feedback = self.request.recv(100) 
            if ( feedback == "recv_ready"):
              #读取文件
              f = file(user_command[1],'rb')
              #循环发送
              send_size = 0
              while not file_size == send_size:
                if file_size - send_size > 1024:
                  data = f.read(1024)
                  send_size += 1024
                else:
                  data = f.read(file_size - send_size)
                  send_size += ( file_size - send_size )
                  print file_size,send_size
                 #每次都发消息
                self.request.send(data)
              else:
                print '---send file:%s done----' % user_command[1]
                f.close()


      else:
        cmd_result="login false"
        #反回响应值长度和结果
        message(cmd_result)
        sendmessage(self,cmd_result)

if __name__ == "__main__":
  HOST,PORT="",9999
  server = SocketServer.ThreadingTCPServer((HOST,PORT),MyTCPHandler)
  server.serve_forever()

客户端


#coding=UTF-8
import socket,os

HOST = '172.0.71.48'
PORT = 9999
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
#user_input = raw_input("What do you wangt tu buy?").strip()
#结果值拼串处理
def recv_all(obj,msg_length):
  raw_result = ''
  while True:
    if msg_length <= 4096:
      data = obj.recv(msg_length)
      print '======',data
      raw_result += data
      break
    else:
      data=obj.recv(4096)
      raw_result += data
      msg_length -=4096
  return raw_result

def recv_result(obj):
  #接收响应值大小size
  res_size = obj.recv(1024)
  print 'size:',res_size
  #接收响应值的结果
  result = recv_all(obj,int(res_size))
  print 'result:',result
  return result

while True:
  #请输入密码
  user_input = raw_input("请输入口令?").strip()
  #如果密码为空
  if( len(user_input)) == 0:
    continue
  else:
    s.send(user_input)
    #等待接收响应值
    result = recv_result(s)
    if ( result == "login pass" ):
      while True:
        user_input = raw_input("请输入命令?").strip()
        #分割字符串
        user_command=user_input.split()
        print "数组长度:",len(user_command)

        #如果长度为2才进行指令发送
        if ( len(user_command) == 2 ):


          if ( user_command[0] == "get" ):
            print "clinet get"
            s.send(user_input)
            #等待接收响应值
            #recv_result(s)
            #等待接收响应值,确认文件是否存在
            feedback = recv_result(s)
            print "----->",feedback
            if ( feedback.startswith("ready") ):
              #接收大小
              file_size = int(feedback.split()[-1])
              #反馈服务器,已经准备好
              s.send("recv_ready")
              #循环接收
              recv_size = 0
              #本地创建文件
              file_name = user_command[1]
              f = file(os.path.basename(file_name),'wb')
              print "--->",file_name
              while not file_size == recv_size:
                if file_size - recv_size > 1024:
                  data = s.recv(1024)
                  recv_size += len(data)
                else:
                  data = s.recv( file_size - recv_size )
                  recv_size += ( file_size - recv_size )
                #接收就写入
                f.write(data)
                print file_size,recv_size
              print "get %s done" % file_name
            else:
              #打印文件不存在
              print feedback
              s.send("recv_faile")


          elif ( user_command[0] == "input" ):
            print "clinet input"
            s.send(user_input)
            #等待接收响应值
            recv_result(s)          
            #判断文件是否存在
            if ( os.path.isfile( user_command[1] ) ):
              print "pass"
              file_size = os.path.getsize(user_command[1])
              #发送文件大小
              res = "ready %s" % file_size
              print '---->',res
              #发送大小
              s.send(res)
              feedback = s.recv(100) 
              if ( feedback == "recv_ready"):
                #读取文件
                f = file(user_command[1],'rb')
                #循环发送
                send_size = 0
                while not file_size == send_size:
                  if file_size - send_size > 1024:
                    data = f.read(1024)
                    send_size += 1024
                  else:
                    data = f.read(file_size - send_size)
                    send_size += ( file_size - send_size )
                    print file_size,send_size
                   #每次都发消息
                  s.send(data)
                else:
                  print '---send file:%s done----' % user_command[1]
                  f.close()
            else:
              #发送文件大小
              print "faile"
              res = "file doesn't exist"
              print '---->',res
              s.send(res)




          elif ( user_command[0] == "shell" ):
            print "clinet shell"
            s.send(user_input)
            #等待接收响应值
            recv_result(s)
            #等待接收响应值
            recv_result(s)
          else:
            print "please input the commands like  get *,input *,shell *"
        else:
          print "wrong in your commands,the parameter must equal two !"
s.close()                    #关闭socket
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python socke ftp功能实现 shell命令,上传,下载 的相关文章

  • 【Python基础】--Pickle/函数默认参数/函数的参数*args/Bytes<=>str/32-64bit/bytes对象

    Pickle gt gt gt import pickle gt gt gt my list 61 1 2 3 39 haha 39 39 and 39 39 or 39 gt gt gt pickle file 61 open 39 my
  • Windows平台python操作串口示例,可以加工下,改写成方便的测试软件

    在 windows中 xff0c 使用 Python 进行串口编程需要安装一个 Serial 模块 pyserial xff1a 下载地址 https pypi python org pypi pyserial下载完成后得到一个 pyser
  • 告别csdn一年了

    原本坚持了4年的学习 xff0c 整理笔记 xff0c 在csdn平台上进行发表 xff0c 记录 同朋友们互动 xff0c 探讨进行学习 xff0c 自己也在不断地成长 今天再次进入博客页面 xff0c 发现界面来了个大改版 xff0c
  • KVM虚拟机创建功能详细讲解

    KVM虚拟机创建功能详细讲解 一 KVM虚拟机创建的用户操作 对于用户或者管理员来说 xff0c 虚拟机的创建有着很多的方法 xff0c 例如 xff1a kvm自带命令行工 具 使用virsh命令来创建 使用具有图形界面的virt man
  • php视频课程

    php视频课程 xff1a 下载地址 xff1a http php itcast cn php video shtml 注 xff1a 此系列视频 xff0c 韩顺平主讲 1 php入门到精通教程 2 第二版mysql视频教程 进行中 3
  • 2014年计算机求职总结--面试篇

    又一年实习招聘陆续开始了 xff0c 这里分享一下我在2013年实习招聘和秋季招聘中的一些面试经历 xff0c 希望能对找工作的同学有所帮助 2013年面试过的公司有蘑菇街 网易游戏 阿里巴巴 腾讯 百度 大众点评 人人网 雅虎 xff08
  • 用位运算实现两个整数的加减乘除运算

    位运算的思想可以应用到很多地方 xff0c 这里简单的总结一下用位运算来实现整数的四则运算 1 整数加法 int Add int a int b for int i 61 1 i i lt lt 61 1 if b amp i for in
  • 深入理解C/C++数组和指针

    版权所有 xff0c 转载请注明出处 xff0c 谢谢 xff01 http blog csdn net walkinginthewind article details 7044380 C语言中数组和指针是一种很特别的关系 xff0c 首
  • 轻松搞定面试中的链表题目

    版权所有 xff0c 转载请注明出处 xff0c 谢谢 xff01 http blog csdn net walkinginthewind article details 7393134 链表是最基本的数据结构 xff0c 面试官也常常用链
  • 轻松搞定面试中的二叉树题目

    版权所有 xff0c 转载请注明出处 xff0c 谢谢 xff01 http blog csdn net walkinginthewind article details 7518888 树是一种比较重要的数据结构 xff0c 尤其是二叉树
  • 动态内存分配(malloc/free)简单实现--隐式空闲链表

    本文使用隐式空闲链表实现简单的动态内存分配 动态内存分配器维护一个大块区域 xff0c 也就是堆 xff0c 处理动态的内存分配请求 分配器将堆视为一组不同大小的块的集合来维护 xff0c 每个块要么是已分配的 xff0c 要么是空闲的 实
  • 二分查找,你真的掌握了吗?

    版权所有 xff0c 转载请注明出处 xff0c 谢谢 xff01 http blog csdn net walkinginthewind article details 8937978 二分查找 xff0c 最基本的算法之一 xff0c
  • 【谷歌面试题】求数组中两个元素的最小距离

    一个数组 xff0c 含有重复元素 xff0c 给出两个数num1和num2 xff0c 求这两个数字在数组中出现的位置的最小距离 O n 时间复杂度 xff0c O 1 空间复杂度 int minDistance int A int si
  • 进程间通信

    原作者地址不详 摘 要 随着人们对应用程序的要求越来越高 xff0c 单进程应用在许多场合已不能满足人们的要求 编写多进程 多线程程序成为现代程序设计的一个重要特点 xff0c 在多进程程序设计中 xff0c 进程间的通信是不可避免的 Mi
  • 关于CPU C-States 省电模式,你需要知道的事情

    为了在CPU空闲的时候降低功耗 xff0c CPU可以被命令进入low power模式 每个CPU都有几种power模式 xff0c 这些模式被统称为C states或者C modes lower power模式最早在486DX4处理器上被
  • 一次由于设置错误,导致无法进入gnome的解决。

    我的系统是lenny 今天 xff0c 在 系统 gt 首选项 gt 音效 中修改了一处设置 xff0c 导致当前账号不能进入gnome 设置的图片如下 xff1a 我选中了 允许软件混音 和 播放系统声音 这两项 xff0c 结果当时系统
  • 分享一下工作以来我看过计算机书籍

    由于自工作依赖一直专注于linux 下的c c 43 43 编程工作 xff0c 所以 xff0c 我的书籍也大的都是这方 这边书尽管很经典 xff0c 但是我的能力实在有限 xff0c 只把数据结构的那点看了一下 xff0c 其他的 看的
  • strlen三种不同的写法

    strlen用来表示字符串的长度 区别于用关键字sizeof 计算字节大小 strlen有三种写法 1 采用常规的count计数法 int my strlen const char str char p 61 char str int co
  • 面试常见链表题总结(如果失眠了就拿出来看看)

    无头单链表 现场手撕代码 43 分析 xff0c 供自己闲时手机复习使用 xff01 删除链表中等于给定值 val 的所有节点 反转一个单链表 给定一个带有头结点 head 的非空单链表 xff0c 返回链表的中间结点 如果有两个中间结点
  • 数据库完美总结(三)

    索引 xff1a 数据库索引 xff0c 是数据库管理系统中一个排序的数据结构 xff0c 它可以对数据库表中一列或多列的值进行排序 xff0c 以协助更加快速的访问数据库表中特定的数据 通俗的说 xff0c 我们可以把数据库索引比做是一本

随机推荐

  • 电商项目数据库

    共8张表 xff0c 放到一个DB文件夹下 1 系统架构 采用当前最流行的ssm xff08 springmvc 43 spring 43 mybatis xff09 框架开发 xff0c 系统后台使用jsp作为视图层 商城系统使用free
  • jar包和war包区别以及怎么部署

    什么是war和jar xff1f war包 是做好一个web应用后 xff0c 通常是网站 xff0c 打成包部署到容器中 jar包 xff1a 通常是开发时要引用通用类 xff0c 打成包便于存放管理 怎么打包 xff1f IDEA上面菜
  • cookie和session

    由于http是无状态的 xff0c 也就是不能做到会话保持 xff0c 那么就需要引入cookie和session来做会话保持 xff0c 存储用户信息 cookies是一种WEB服务器通过浏览器在访问者的硬盘上存储信息的手段 IE浏览器把
  • Sprinig Boot + Redis 如何实现接口幂等性

    幂等性 通俗的说就是一个接口 多次发起同一个请求 必须保证操作只能执行一次 可能出现的问题 xff1a 订单接口 不能多次创建订单 支付接口 重复支付同一笔订单只能扣一次钱 回调接口 可能会多次回调 必须处理重复回调 普通表单提交接口 因为
  • 线程池面试

    一 线程池是什么 线程池 xff08 Thread Pool xff09 构造参数有8个 xff0c 但是最核心的是3个 xff1a corePoolSize核心数 maximumPoolSize最大线程数 xff0c workQueue任
  • Raft的PreVote实现机制

    Raft的PreVote实现机制 1 背景 在Basic Raft算法中 xff0c 当一个Follower与其他节点网络隔离 xff0c 如下图所示 xff1a Follower 2在electionTimeout没收到心跳之后 会发起选
  • C、Java、Python到底优劣在哪里?

    C C是大部分转行编程或者是入门学习人员最开始接触的语言 xff0c 虽说C语言在内存管理上存在严重的缺陷 xff0c 尤其是 0 的设计被很多人吐槽是最大的败笔 xff0c 但是毫无疑问 xff0c 对那些要求最高的效率 xff0c 良好
  • LWIP 单网口多IP地址

    空间 ethernet input struct pbuf p struct netif netif 此函数有两个参数 xff0c p指向接收到的网络数据 xff0c netif则是指示哪个网络接口收到的数 据 xff0c 但是在LWIP内
  • C/C++优秀书籍清单

    转载自 xff1a https www cnblogs com kimiway p 3225767 html 书籍是码农进步的阶梯 读好书 好读书 干一行爱一行 除了工作还有生活 在陪伴家人同时 也不忘提高自己 为更好的生活努力 1 C程序
  • 一完整的HTTP事务是怎样的过程

    原文地址 xff1a http www cnblogs com renfanzi p 5838446 html 阅读目录 一次完整的HTTP事务是怎样一个过程 xff1f 一 域名解析 二 发起TCP的三次请求 TCP 为什么需要3次握手
  • Centos8中安装jdk1.8

    CentOS8 中原有安装OpenJDK1 8 属于JRE版本 xff0c 当前在编译打包Maven工程时报错 xff0c 查看错误原因 xff0c JAVA环境不满足导致编译失败 卸载系统自带OpenJDK xff0c 重新安装 卸载Op
  • 问vimscript转lua原因

    开始 xff1a 原以为是脚本语言翻译过去 xff0c 就是换lua了 xff0c 结果是错误的 问题 xff1a 转换的意义是什么 答案 xff1a 所有插件全部换lua写的提升性能 xff0c 部分插件使用原有的 官方资源 xff1a
  • iphone摄像头代替matebook 14D

    第一步下载软件 第二步 手机与电脑 连接同一个wifi 第三步 查看iphoneip 电脑软件录入ip
  • android安全框架工具drozer使用指南

    不贴图 xff0c 太麻烦 一 Drozer 工作环境搭建 下载drozer installer 2 3 4 zip 2 xff0c 解压缩 3 xff0c winddows上安装setup exe 手机安全agent apk 4 手机打开
  • FTP上传中文设置

    package com wq test import java io File import java io FileInputStream import org apache commons net ftp FTPClient impor
  • FTP上传中文文件到中文路径

    package com wq test import java io File import java io FileInputStream import org apache commons net ftp FTPClient impor
  • leveldb之log文件

    leveldb之log文件 1 log文件在LevelDb中的主要作用是系统故障恢复时 xff0c 能够保证不会丢失数据 因为在将记录写入内存的Memtable之前 xff0c 会先写入Log文件 xff0c 这样即使系统发生故障 xff0
  • springboot @Slf4j 只显示Error 日志,不显示INFO日志 和DEBUG 日志

    问题 xff1a springboot 使用 64 Slf4j 注解的 log debug log info log error 只显示ERROR日志 xff0c 不显示DEBUG和INFO日志 原因 xff1a application p
  • 盘点 | 2023年最值得学的编程语言TOP 5,Python再度夺冠!

    前言 在技术的推动发展中 xff0c 编程语言的作用功不可 目前在技术领域约有600种语言 xff0c 人们对编程语言的认识和掌握情况每年都在变化 与此同时 xff0c 新兴的编程语言往往具有引人注目的元素和功能 2023年热门的编程语言有
  • python socke ftp功能实现 shell命令,上传,下载

    python socke ftp功能实现 shell命令 xff0c 上传 xff0c 下载 网上教程多 xff0c 但是都不全 xff0c 只有下载代码 本人练习 xff0c 附加了注释 xff0c 帮助新人练习 一定要吃透socket来