模拟ssh, hashlib模块, struct模块, subprocess模块

Posted nacholau

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟ssh, hashlib模块, struct模块, subprocess模块相关的知识,希望对你有一定的参考价值。

一. 模拟ssh

# ===================================== 服务器端 =====================================

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]  # unpack是一个元组
	print("data_length", data_length)

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

  

二. hashlib模块

import hashlib

md5=hashlib.md5()
md5.update(b"hello")
md5.update(b"yuan")

print(md5.hexdigest())
print(len(md5.hexdigest()))

#helloyuan:   d843cc930aa76f7799bba1780f578439
#             d843cc930aa76f7799bba1780f578439       # 多次update和单次update结果一样

#############################################

md5=hashlib.md5()

with open("ssh_client.py","rb") as f:
    for line in f:
        md5.update(line)     # 多次update和单次update结果一样

print(md5.hexdigest()) # f.read()

  

三. struct模块

import struct

res=struct.pack("i",2934781)

print(res)
print(len(res))

obj=struct.unpack("i",res)
print(obj[0])

  

四. subprocess模块 # windows系统明命令

import subprocess

res=subprocess.Popen("dir",
                     shell=True,
                     stderr=subprocess.PIPE,
                     stdout=subprocess.PIPE)


print(res.stdout.read().decode("gbk"))

  

 

以上是关于模拟ssh, hashlib模块, struct模块, subprocess模块的主要内容,如果未能解决你的问题,请参考以下文章

python 复习——网络编程模拟ssh黏包hashlib模块

常用模块(time,os,random,hashlib)

loggin模块,hashlib模块

time,datatime,random,os,sys,hashlib模块

socket网络编程:最终版本的ssh模拟程序(标准cs构架模板)

Ruby 解压到 Python