套接字的信仰
一切皆文件
昨日作业:
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"))
同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种显现就是黏包。
二、黏包
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()