subprocess、struct模块的简单应用与ssh模型(黏包)

一、subprocess模块  #可以通过传递字符串命令,帮你去实现一些操作系统的命令。

import subprocess
res = subprocess.Popen("dir",
                       shell=True,
                       stderr=subprocess.PIPE,
                       stdout=subprocess.PIPE
                       )
ret = res.stdout.read().decode("gbk")
print(ret)

二、struct模块

import struct
res = struct.pack("i",6465789)  #"q",8个字节
print(res)  #b'xfdxa8bx00'
print(len(res)) #4
ret = struct.unpack("i",res)
print(ret)   #(6465789,)
print(ret[0])   #6465789

三、ssh模型(黏包)

server

import subprocess
import socket
import struct

server = socket.socket()
server.bind(("127.0.0.1",8101))
server.listen(5)
while 1:
    conn,addr = server.accept()
    while 1:
        try:
            server_cmd = conn.recv(1024).decode("utf8")
            res = subprocess.Popen(server_cmd,
                                   shell=True,
                                   stderr=subprocess.PIPE,
                                   stdout=subprocess.PIPE
                                   )
            if server_cmd == b"exit":
                break
            response1 = res.stdout.read()
            response2 = res.stderr.read()
            if response2:
                pack = struct.pack("i",(len(response2)))
                conn.send(pack)
                conn.send(response2)
            else:
                pack = struct.pack("i",(len(response1)))
                conn.send(pack)
                conn.send(response1)
        except Exception as e:
            break
    conn.close()

client

import socket
import struct
client = socket.socket()
client.connect(("127.0.0.1",8101))
while 1:
    client_cmd = input("请输入您的命令:")
    client.send(client_cmd.encode("utf8"))
    if client_cmd == "exit":
        break
    if client_cmd == "":
        continue
    pack = client.recv(4)
    print(pack)
    data_length = struct.unpack("i",pack)[0]
    print(data_length)
    recv_data_length = 0
    recv_data = b""

    while recv_data_length < data_length:
        data = client.recv(1024)
        recv_data_length += len(data)
        recv_data += data

    print(recv_data.decode("gbk"))

client.close()
原文地址:https://www.cnblogs.com/qq849784670/p/9585513.html