client端发送shell命令,server端将命令执行结果返回给client端

server端

import socket,subprocess
sk = socket.socket()
address = ('127.0.0.1',8000)
sk.bind(address)
sk.listen(3)    #这里的3是指允许等待连接的数量
print('waitting......')
while True:
    conn,addr = sk.accept()
    print(addr)
    while True:
        try:
            data = conn.recv(1024)
        except Exception as e:    #连接后server端会等待client端发送数据,此处加入异常处理是为了防止client端突然终止程序使server端报错
            break
        if not data:break    #client发送为空时,断开
        print('........',str(data,'utf-8'))
        obj=subprocess.Popen(str(data,'utf-8'),shell=True,stdout=subprocess.PIPE)
        cmd_result = obj.stdout.read()
        result_len=bytes(str(len(cmd_result)),'utf-8')    #获取命令执行结果的输出长度
        conn.sendall(result_len)    #发送命令执行结果的输出长度给client端,让client端判读需要接收多少数据才停止
        conn.recv(1024)    #这个conn.recv作用是间隔上下两个sendall,防止粘包
        conn.sendall(cmd_result)
sk.close()

client端

import socket
sk = socket.socket()    #建立tcp连接
address = ('127.0.0.1',8000)
sk.connect(address)
while True:
    inp=input('>>>')
    if inp == 'exit':    #如果输入exit,终止连接
        break
    sk.send(bytes(inp,'utf-8'))    #先发送命令
    result_len=int(str(sk.recv(1024),'utf-8'))    #接收server端返回数据的长度
    sk.sendall('OK')
    print(result_len)
    data=bytes()    #初始化一个变量data用于接收server端返回数据,类型为bytes,初始长度为0
    while len(data) != result_len:    #判断是否已经接收完server端发来的数据
        recv = sk.recv(1024)
        data+=recv    #累加每次接收的数据
    print(str(data,'gbk'))    #将接收到的数据data转为字符串类型
sk.close()

 

posted on 2021-12-15 10:59  csy113  阅读(33)  评论(0编辑  收藏  举报