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()
课上练习题:
# 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()
day 28 黏包 ssh模块 subprocess模块的更多相关文章
- python网络编程--粘包解决方案 和 subprocess模块
1.缓冲区:作用:将程序和网络解耦分为输入缓冲区, 输出缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区.write()/send() 并不立即向网络中传输数据,而是先 ...
- 2、网络并发编程--套接字编程、黏包问题、struct模块、制作简易报头、上传文件数据
昨日内容回顾 面向对象复习(json序列化类) 对象.类.父类的概念 三大特性:封装 继承 多态 双下开头的方法(达到某个条件自动触发) __init__:对象实例化自动触发 __str__:对象执行 ...
- 28、初识socket(subprocess模块)
经过近一个半月的学习我们已经度过了python基础的阶段,今天我们开始学习python网络编程,没有难以理解的逻辑,更注重的是记忆. 本篇导航: 客户端/服务器架构 scoket与网络协议 套接字 基 ...
- s14 第5天 时间模块 随机模块 String模块 shutil模块(文件操作) 文件压缩(zipfile和tarfile)shelve模块 XML模块 ConfigParser配置文件操作模块 hashlib散列模块 Subprocess模块(调用shell) logging模块 正则表达式模块 r字符串和转译
时间模块 time datatime time.clock(2.7) time.process_time(3.3) 测量处理器运算时间,不包括sleep时间 time.altzone 返回与UTC时间 ...
- day 28 黏包及黏包解决方案
1.缓冲区 每个socket被创建以后,都会分配两个缓冲区,输入缓冲区和输出缓冲区,默认大小都是8k,可以通过getsocket()获取,暂时存放传输数据,防止程序在发送的时候卡阻,提高代码运行效率. ...
- python day 9: xlm模块,configparser模块,shutil模块,subprocess模块,logging模块,迭代器与生成器,反射
目录 python day 9 1. xml模块 1.1 初识xml 1.2 遍历xml文档的指定节点 1.3 通过python手工创建xml文档 1.4 创建节点的两种方式 1.5 总结 2. co ...
- python hashlib模块 logging模块 subprocess模块
一 hashlib模块 import hashlib md5=hashlib.md5() #可以传参,加盐处理 print(md5) md5.update(b'alex') #update参数必须是b ...
- Python全栈之路----常用模块----subprocess模块
我们经常需要通过Python去执行一条系统命令或脚本,系统的shell命令是独立于你的python进程之外的,每执行一条命令,就是发起一个新进程,通过python调用系统命令或脚本的模块在python ...
- os模块,os.path模块,subprocess模块,configparser模块,shutil模块
1.os模块 os表示操作系统该模块主要用来处理与操作系统相关的操作最常用的文件操作打开 读入 写入 删除 复制 重命名 os.getcwd() 获取当前执行文件所在的文件夹路径os.chdir(&q ...
随机推荐
- bootstrap网格系统.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- Java HashMap底层实现原理源码分析Jdk8
在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里.但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依 ...
- 二叉树,红黑树,B树,B+树
1.不要认为红黑树仅仅是在二叉树的节点上涂上颜色,他们最根本的区别是,红黑树根据节点涂色的约束限制,最终形成的树的结构与普通二叉树不同,最重要的是,其树的高度大大缩短,从而在查找.增删改等方面提高效率 ...
- (Java) AES-128 数据加密
package com.vcgeek.hephaestus.utils; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeyS ...
- [springboot 开发单体web shop] 2. Mybatis Generator 生成common mapper
Mybatis Generator tool 在我们开启一个新项目的研发后,通常要编写很多的entity/pojo/dto/mapper/dao..., 大多研发兄弟们都会抱怨,为什么我要重复写CRU ...
- SCOI2005 繁忙的都市 [Luogu P2330]
题目描述 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路口之间最多有一条 ...
- MIT线性代数:10.4个基本子空间
- [2018-01-12] laravel中的MVC
路由里面可以做所有事情,但是真正的项目当中,路由只用来接收请求,并转发给控制器的方法进行处理 首先我们先了解一下 一.app/Http/routes路由的用法: 方法一. 这种方法写完后在控制器创建方 ...
- [知识图谱]利用py2neo从Neo4j数据库获取数据
# -*- coding: utf-8 -*- from py2neo import Graph import json import re class Neo4jToJson(object): &q ...
- for循环使用笔记
1.for i in rang(1,101,2) #2为步长 print("loop",i) 2.flag 标志位3.for 循环CODE1 for与else一起用:当for循环正 ...