day 28 黏包 ssh模块 subprocess模块
2024-10-07 08:41:17
套接字的信仰
一切皆文件
昨日作业:
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()
课上练习题:
# by luffycity.com import socket
import subprocess server = socket.socket() server.bind(('127.0.0.1',8008)) server.listen(5) while True:
print("server is working.....")
conn,addr = server.accept()
# 字节类型
while True:
# 针对window系统
try:
cmd = conn.recv(1024).decode("utf8") # 阻塞 if cmd == b'exit':
break res=subprocess.Popen(cmd,
shell=True,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE,
)
# print("stdout",res.stdout.read())
# print("stderr",res.stderr.read().decode("gbk"))
out=res.stdout.read()
err=res.stderr.read() print("out响应长度",len(out))
print("err响应长度",len(err))
if err:
import struct
header_pack = struct.pack("i", len(err))
conn.send(header_pack)
conn.send(err)
else:
#构建报头
import struct
header_pack=struct.pack("i",len(out))
print("header_pack",header_pack)
# # 发送报头
conn.send(str(len(out)).encode("utf8"))
# 发送数据
conn.send(out) except Exception as e:
break conn.close()
import socket
import struct
sk = socket.socket() sk.connect(('127.0.0.1',8008)) while 1:
cmd = input("请输入命令:")
sk.send(cmd.encode('utf-8')) # 字节
if cmd=="":
continue
if cmd == 'exit':
break # header_pack=sk.recv(4)
# data_length=struct.unpack("i",header_pack)[0]
# print("data_length",data_length)
'''
b'xxx/xxx/xxx/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
'''
data_length=int(sk.recv(1024).decode("utf8"))
print("data_length",data_length) recv_data_length=0
recv_data=b"" while recv_data_length<data_length:
data=sk.recv(1024)
recv_data_length+=len(data)
recv_data+=data print(recv_data.decode("gbk")) sk.close()
最新文章
- 蜻蜓FM笔试题目,求两个点的最近父节点
- tinyPng Photoshop Plugin 安装的坑
- OWASP WEB会话管理备忘单 阅读笔记
- linux下定时任务的使用
- 关于WinForm引用WPF窗体---在Winform窗体中使用WPF控件
- php大力力 [012节]PHP连接mySQL数据库
- 《深入Java虚拟机学习笔记》- 第12章 整数运算
- ansible 学习与实践
- add BOM to fix UTF-8 in Excel
- ERROR 1062 (23000): Duplicate entry &#39;1-1&#39; for key &#39;PRIMARY&#39;
- mysql 多重游标嵌套
- POJ1182 食物链 【并查集变种】
- JavaBean,List,Map转成json格式
- windows7 安装TensorFlow
- 将电脑文件复制到vm虚拟机中,然后安装步骤
- UNIX网络编程——UDP回射服务器程序(初级版本)以及漏洞分析
- 自定义view入门
- Bandwagon的配置记录(二) —— ftp文件传输
- spring boot websocket stomp 实现广播通信和一对一通信聊天
- Kafka原理总结
热门文章
- 设计模式(十九)State模式
- SpringBoot与MybatisPlus3.X整合之通用枚举(十二)
- Spring为IOC容器注入Bean的五种方式
- ArangoDB简单实例介绍
- ArangoDB 界面介绍
- 第九篇 Flask的before_request和after_request
- Oracle 相关操作SQL
- Unity中用Mesh画一个圆环
- shell的运用 : jenkins 编译 打包前端发布 生产(tomcat)
- 6.2.2 辅助类GenericOptionsParser,Tool和ToolRunner深入解析