作业

基于TCP开发一款远程CMD程序
客户端连接服务器后,可以向服务器发送命令
服务器收到命令后执行,无论执行是否成功,无论执行几遍,都将执行结果返回给客户端

方法一:通过os模块

服务端:

import socket,os


serve = socket.socket()
serve.bind(('127.0.0.1',9527))
serve.listen(5)
#conn相当于服务端往客户端的的管道

while True:
    conn, addr = serve.accept()
    print(f'{addr}successful connection')
    while True:

        try:
            cmd = conn.recv(1024)
            print(cmd.decode('utf-8'))
            if cmd == 'q':
                break
            if not cmd:
                print('Client is not connected')
                break
            print(f'The command is {cmd}')
            data = os.popen(cmd.decode('utf-8')).read()
            #os.popen() 方法用于从一个命令打开一个管道

            conn.send(data.encode('utf-8'))

            # send_msg = input('server:').encode('utf-8')
            # conn.send(send_msg)
        except Exception as e:
            print(e)
            break
    conn.close()

客户端:

import socket

client = socket.socket()

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


while True:
    msg = input('client:').strip()
    client.send(msg.encode('utf-8'))
    if msg == 'q':
        break
    data = client.recv(1024).decode('utf8')
    print(data)
client.close()

方法二:通过subprocess模块

服务端

import socket
import subprocess

# cmd_obj = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
cmd_obj = socket.socket()
cmd_obj.bind(('127.0.0.1',9527))
cmd_obj.listen(5)
while True:
    client,client_ip = cmd_obj.accept()
    print(client_ip)

    while True:

        cmd_script = client.recv(1024).decode('utf-8')
        if not cmd_script:
            continue

        if cmd_script == 'exit':
            break

        data = subprocess.Popen(cmd_script,shell = True,
                               stdout = subprocess.PIPE,
                               # stdin = subprocess.PIPE,
                               stderr=subprocess.PIPE)
        stdout = data.stdout.read()
        stderr = data.stderr.read()
        res = stdout + stderr
        print(res)#这里得到的是二进制需要通过解码所以要在客户端以gbk进行解码,另外windows系统识别的是gbk格式的编码所以这个二进制是gbk转过来的
        client.send(res)
    client.close()
    break
cmd_obj.close()

客户端

import socket

client = socket.socket()

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


while True:
    msg = input('client:').strip()
    client.send(msg.encode('utf-8'))
    if msg == 'q':
        break
    data = client.recv(1024).decode('gbk')
    #data = bytes(data,encoding='utf-8')
    print(data)
client.close()

posted @ 2019-10-17 19:29  ylpb  阅读(100)  评论(0编辑  收藏  举报