python socket SSH

server:

# -*- coding: utf-8 -*-

import socket,os

server  = socket.socket()
server.bind(('localhost',9999))

server.listen()

while True:
    conn, addr = server.accept()
    print("new connect:",addr)
    while True:
        data= conn.recv(1024)
        if not data:
            print("客户端已断开")
            break
        print("执行指令:"+data.decode())
        cmd_res = os.popen(data.decode()).read()
        if len(cmd_res) == 0:
            cmd_res="cmd has no output"
            #整数不能直接encode , 要先转成string 在encode
        conn.send(str(len(cmd_res.encode())).encode(encoding='utf_8', errors='strict') ) #先发送大小给客户端
        
        #解决粘包的问题
        client_ack = conn.recv(1024)
        conn.send(cmd_res.encode(encoding='utf_8', errors='strict'))

server.close()

client:

# -*- coding: utf-8 -*-

import socket
client  = socket.socket()

client.connect(('localhost',9999))

while True:
    cmd = input(">>:").strip()
    if len(cmd)==0:continue
    
    client.send(cmd.encode(encoding='utf_8', errors='strict'))
    
    #接收命令结果的长度
    cmd_res_size = client.recv(1024)
    print("cmd_res_size is :",cmd_res_size.decode())
    #解决粘包问题
    client.send(b"send")
    received_size =0
    received_data = b""
    while received_size < int(cmd_res_size.decode()):
#         print(received_size )
        cmd_res = client.recv(1024)
        #每次收到的字节数
        received_size = received_size+ len(cmd_res)
        received_data = received_data+cmd_res
    print(received_data.decode())
client.close()
原文地址:https://www.cnblogs.com/gaizhongfeng/p/7998304.html