10.17小作业 基于TCP开发一款远程CMD程序

基于TCP开发一款远程CMD程序
客户端连接服务器后,可以向服务器发送命令
服务器收到命令后执行,无论执行是否成功,无论执行几遍,都将执行结果返回给客户端
注意: 执行系统指令使用subprocess模块完成.
本题目不考虑接收时的粘包问题

# 客户端
import socket

client = socket.socket()
client.connect(('127.0.0.1',8889))

while True:
    cmd = input('请发送命令:').strip()
    if len(cmd) == 0:
        continue

    if cmd == 'q':
        client.send(b'q')
        break

    cmd = cmd.encode('utf-8')
    client.send(cmd)

    byte_data = client.recv(1024)
    print(byte_data.decode('gbk'))

# 服务端

import socket
import subprocess

server = socket.socket()
server.bind(('127.0.0.1',8889))
server.listen(5)
while True:
    conn,addr = server.accept()

    while True:
        try:
            cmd = conn.recv(1024)
            if len(cmd) == 0:
                continue

            cmd = cmd.decode('utf-8')
            if cmd == 'q':break
            obj = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)  # 这里cmd必须是字符串类型,不是bytes类型的字符串
            print(obj)  # <subprocess.Popen object at 0x00000000029C6D30>   对象

            # print(obj.stdout.read())  # b'' 没赋值变量名返回的是空
            success = obj.stdout.read()  # 必须赋值一个变量才有值
            # print(success)  #  返回的是二进制,可以直接基于网络传输

            # print(obj.stderr.read())  # b'' 没赋值变量名返回的是空
            error = obj.stderr.read()
            # print(error)  # 返回不正确命令的报错信息

            if success:
                conn.send(success)
            else:
                conn.send(error)
        except Exception as e:  # 捕获客服端人为断开连接,不至于服务端报错率而断开,毕竟服务端是24h不间断服务的
            print(e)
            break
    conn.close()


posted on 2019-10-17 20:10  jueyuanfengsheng  阅读(250)  评论(0编辑  收藏  举报