zoukankan      html  css  js  c++  java
  • day 28 黏包 ssh模块 subprocess模块

    套接字的信仰

      一切皆文件

    昨日作业:

    import socket
    
    sock=socket.socket() # TCP协议
    IP_PORT=("127.0.0.1",8899)
    sock.bind(IP_PORT)
    sock.listen(5)
    
    while 1:
        conn,addr=sock.accept()
        while 1:
            try:
                data=conn.recv(1024).decode("utf8")
                user,pwd=data.strip().split("|")  #strip 是为了去掉接受到文件中的空格
                             #split是以|为分割线,分隔输入进来的字符串分割后形成列表
    
                # 文件操作
                flag=False
                with open("account","r") as f:
    
                    for line in f:
                        username,password=line.strip().split(":")     
                        if username==user and password==pwd:
                            flag=True
                            break
                if flag:
                    conn.send(b"success")
                else:
                    conn.send(b"fail")
            except Exception as e:
                break                                                    
    服务端
    import socket
    
    sock=socket.socket() # TCP
    sock.connect(("127.0.0.1",8899))
    
    while 1:
        user=input("用户名>>>>")
        pwd=input("密码>>>>")
        val=("%s|%s"%(user,pwd)).encode("utf8")
        sock.send(val)
        response=sock.recv(1024)
        print(response.decode("utf8"))
        if response.decode("utf8")=="success":
            break
        else:
            print("用户名或者密码错误!")
            continue
    客户端

     一、模拟ssh

      调用执行命令的程序:

    import subprocess
    
    res=subprocess.Popen("dir",
                         shell=True,
                         stderr=subprocess.PIPE,
                         stdout=subprocess.PIPE)
    
    
    print(res.stdout.read().decode("gbk"))
    subprocess
    同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种显现就是黏包。

    二、黏包

    import struct

    res=struct.pack("i","52526") #i 是一个整形模式

    print(res) #b'Qxe4x06x00' 是一个看不懂四个字节

    print(len(res))

    obj=struct.unpack("i",res)

    print(obj) #(52526,)
    print(obj[0]) #取元组的第一项

    #功能,把一组数据转化为一个4位数字是东西
    # 构造报头数据
    hashlib 的经典用法:做数据移植性校验,就是本地上用一次,对面用一次,利用不可逆性,发生修改的话队形的hashlib将会不一样
    import
    hashlib md5=hashlib.md5() md5.update(b"hello") md5.update(b"yuan") print(md5.hexdigest()) print(len(md5.hexdigest())) # # helloyuan: d843cc930aa76f7799bba1780f578439 两次加密的效果是一样的 # # d843cc930aa76f7799bba1780f578439 ############################################# md5=hashlib.md5() with open("ssh_client.py","rb") as f: for line in f: #文件较大的话,一次打开太占内存 md5.update(line) #此方法和md5.update(f.read())的结果是一样的 和上面的效果是一样 print(md5.hexdigest()) # f.read()

    课上练习题:

     1 # by luffycity.com
     2 
     3 import socket
     4 import subprocess
     5 
     6 server = socket.socket()
     7 
     8 server.bind(('127.0.0.1',8008))
     9 
    10 server.listen(5)
    11 
    12 while True:
    13     print("server is working.....")
    14     conn,addr = server.accept()
    15     # 字节类型
    16     while True:
    17         # 针对window系统
    18         try:
    19             cmd = conn.recv(1024).decode("utf8") # 阻塞
    20 
    21             if cmd == b'exit':
    22                 break
    23 
    24             res=subprocess.Popen(cmd,
    25                              shell=True,
    26                              stderr=subprocess.PIPE,
    27                              stdout=subprocess.PIPE,
    28                              )
    29             # print("stdout",res.stdout.read())
    30             # print("stderr",res.stderr.read().decode("gbk"))
    31             out=res.stdout.read()
    32             err=res.stderr.read()
    33 
    34             print("out响应长度",len(out))
    35             print("err响应长度",len(err))
    36             if err:
    37                  import struct
    38                  header_pack = struct.pack("i", len(err))
    39                  conn.send(header_pack)
    40                  conn.send(err)
    41             else:
    42                  #构建报头
    43                  import struct
    44                  header_pack=struct.pack("i",len(out))
    45                  print("header_pack",header_pack)
    46                  # # 发送报头
    47                  conn.send(str(len(out)).encode("utf8"))
    48                  # 发送数据
    49                  conn.send(out)
    50 
    51 
    52 
    53 
    54         except Exception as e:
    55             break
    56 
    57 
    58     conn.close()
     1 import socket
     2 import struct
     3 sk = socket.socket()
     4 
     5 sk.connect(('127.0.0.1',8008))
     6 
     7 while 1:
     8     cmd = input("请输入命令:")
     9     sk.send(cmd.encode('utf-8')) # 字节
    10     if cmd=="":
    11         continue
    12     if cmd == 'exit':
    13         break
    14 
    15     # header_pack=sk.recv(4)
    16     # data_length=struct.unpack("i",header_pack)[0]
    17     # print("data_length",data_length)
    18     '''
    19     b'xxx/xxx/xxx/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
    20     '''
    21     data_length=int(sk.recv(1024).decode("utf8"))
    22     print("data_length",data_length)
    23 
    24     recv_data_length=0
    25     recv_data=b""
    26 
    27     while recv_data_length<data_length:
    28         data=sk.recv(1024)
    29         recv_data_length+=len(data)
    30         recv_data+=data
    31 
    32     print(recv_data.decode("gbk"))
    33 
    34 
    35 sk.close()
  • 相关阅读:
    李航博士:浅谈我对机器学习的理解
    数据挖掘过程中:数据预处理
    C++:构造函数和析构函数能否为虚函数
    PCA的数学原理
    奇异值分解(SVD) --- 几何意义
    3月机器学习在线班第六课笔记--信息熵与最大熵模型
    ML:交叉验证Cross-Validation
    LaTex的注释
    混合高斯模型
    NE2018届校招内推笔试——数据挖掘
  • 原文地址:https://www.cnblogs.com/xiaobai686/p/11784029.html
Copyright © 2011-2022 走看看