模拟ssh远程执行命令

模拟ssh远程执行命令

一、服务器

import socket
import subprocess

soc = socket.socket()
soc.bind(('127.0.0.1', 8001))
soc.listen(5)

while True:
    conn, addr = soc.accept()
    while True:
        try:
            data = conn.recv(1024)

            if len(data) == 0:
                break
            print("收到客户端信息", data)
            obj = subprocess.Popen(
                data.decode('utf-8'),
                shell=True,
                stdout=subprocess.PIPE,  # 把正确输出放入管道,以便打印
                stderr=subprocess.PIPE  # 把错误输出放入管道,以便打印
            )
            # 执行正确的结果,b格式, gbk编码(windows平台)
            # stdout是二进制
            msg = obj.stdout.read()
            # 把执行结果通过网络传给c端
            conn.send(msg)
        except Exception as e:
            print(e)
            break
    conn.close()

soc.close()

二、客户端

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client.connect(('127.0.0.1', 8000))

while True:
    data = input('请输入要执行的命令')
    client.send(data.encode('utf8'))
    data = client.recv(1024)

    print(data.decode('gbk'))

client.close()

输入dir命令,由于服务端发送字节少于1024字节,客户端可以接受。

输入tasklist命令,由于服务端发送字节多于1024字节,客户端只接受部分数据,并且当你再次输入dir命令的时候,客户端会接收dir命令的结果,但是会打印上一次的剩余未发送完的数据,这就是粘包问题。

在当下的阶段,必将由程序员来主导,甚至比以往更甚。
原文地址:https://www.cnblogs.com/randysun/p/11516912.html