編寫C/S架構的程序,實現遠程執行命令,思路以下
一、客戶端接收用戶輸入的命令,而後發送給服務端,
二、服務端根據傳來的數據調用subprocess模塊執行系統命令,而後將結果返回給客戶端,在客戶端打印python
錯誤概括,續更,(正確示例請挪步下翻至底):shell
一、在客戶端接受到服務端發送的報頭,遺漏讀取報頭長度的錯誤:json
header_bytes = client.recv(header_size)
二、以下圖,strcut解包時,獲得結果爲元組,應當使用索引取值。服務器
header_size = struct.unpack('i',client.recv(4))[0]
client.py架構
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/04/20 14:51 # @Author : MJay_Lee # @File : client.py # @Contact : limengjiejj@hotmail.com import socket import struct import json client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) client.connect(('127.0.0.1',8080)) while True: cmd = input('請輸入通訊內容>>:').strip() client.send(cmd.encode('utf-8')) header_size = struct.unpack('i',client.recv(4))[0] header_bytes = client.recv(header_size) header_json = header_bytes.decode('utf-8') header_dic = json.loads(header_json) total_size = header_dic['header_len'] recv_size = 0 res = b'' while recv_size < total_size: recv_data = client.recv(1024) res += recv_data recv_size += len(recv_data) print(res.decode('gbk')) # print('來自服務器的消息:',msg.decode('gbk')) client.close()
server.pysocket
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/04/20 14:51 # @Author : MJay_Lee # @File : Sever.py # @Contact : limengjiejj@hotmail.com import socket import subprocess import json import struct server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.bind(('127.0.0.1',8080)) server.listen(5) print('start...') # 循環鏈接 while True: conn,client_addr = server.accept() print(client_addr,'接入服務器') while True: try: msg = conn.recv(1024) print('來自客戶端的消息:', msg.decode('utf-8')) obj = subprocess.Popen(msg.decode('utf-8'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) obj_stdout = obj.stdout.read() obj_stderr = obj.stderr.read() obj_len = len(obj_stdout) + len(obj_stderr) header_dic = { 'header_len':obj_len } header_json = json.dumps(header_dic) header_bytes = header_json.encode('utf-8') # 先發送報頭長度 header_size = len(header_bytes) conn.send(struct.pack('i',header_size)) # 發送報頭 conn.send(header_bytes) conn.send(obj_stdout) conn.send(obj_stderr) # conn.send(msg+b'_accept') except ConnectionResetError: print(client_addr,'客戶端停止連接') break conn.close() server.close()