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'Q\xe4\x06\x00' 是一个看不懂四个字节

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()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-11-02 20:58  小白686  阅读(126)  评论(0编辑  收藏  举报