使用socket套接字 模拟ssh远程执行命令。c/s架构网络通信

使用python执行系统命令-使用sunprocess模块
 

# subprocess-->>目地是提供统一的模块来实现对系统命令或脚本的调用
import subprocess
obj = subprocess.Popen(r'dir C:\Users\huawang',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print('stdout 1--->',obj.stdout.read().decode('gbk')) # 从管道中读取数据
# print('stdout 2--->',obj.stdout.read().decode('gbk')) # 从管道中读取数据

 

服务端(s)
 


import socket
import subprocess

socket_obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 生成一个socket实例
socket_obj.bind(('127.0.0.1', 8082))
socket_obj.listen(3)

# 收,发数据
while True: #通信循环
    conn, adder_c = socket_obj.accept()  # 获取conn链接渠道
    while True:
        try:
            # 收命令
            cmd = conn.recv(1024)  # 接受data
            # if not cmd: break  # 适用于linux操作系统
            # 执行命令,拿到结果
            obj = subprocess.Popen(cmd.decode('utf-8'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            stdout = obj.stdout.read()
            stderr = obj.stderr.read()
            # 把命令的结果返回给客户端
            conn.send(stdout + stderr)  # 返回值
        except ConnectionResetError:  # 适用于window系统
            break

    conn.close()
# socket_obj.close()

客户端(c)


import socket
socket_obj = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
socket_obj.connect(('127.0.0.1',8082))

while True:
    # 1.发命令
    cmd = input('>>').strip()
    if not cmd:continue
    socket_obj.send(cmd.encode('utf-8'))

    # 2.拿到结果,并打印
    cmd_result = socket_obj.recv(1024)  # 粘包
    print(cmd_result.decode('GBK'))

# socket_obj.close()

 

你可能感兴趣的:(网络编程)