3.服务端远程执行客户端命令

本次的内容为使用socket,来完成客户端发送命令,服务端接收命令,并将命令执行的结果显示在结果中。

需要在服务端使用subprocess来执行服务端的语句

#客户端代码:
import socket
sk=socket.socket()
address=('127.0.0.1',8000)
sk.connect(address)
while 1:
    data=bytes(input('想让服务端执行什么:'),encoding='utf-8')
    if data == bytes('exit', encoding='utf-8'):
        break
    sk.send(data)
    result_len=int(sk.recv(10).decode('utf-8'))     #收取服务端发送的长度,解码后转成int类型
    recv=sk.recv(result_len+10).decode('gbk')   #根据收取数据的长度,来设置一次收取数据的大小,动态设置长度,节省内存和加快运行
    print(recv)         #打印服务端发送的指令执行的结果
sk.close()
print('结束')
服务端程序:
import socket
import subprocess
sk=socket.socket()
address=('127.0.0.1',8000)
sk.bind(address)
sk.listen(3)
print('waiting...')
while 1:
    con,add=sk.accept()
    while 1:
        try:
            data = con.recv(1024)
        except Exception:
            break
        if not data:
            break
        print('命令为:' + data.decode('utf-8'))
        obj=subprocess.Popen(data.decode('gbk'),shell=True,stdout=subprocess.PIPE)   #将执行命令的结果封装成一个对象,stdout=subprocess.PIPE一定要加,它将命令行的结果拦截,封装在自己的对象里
        ret=obj.stdout.read()    #读取对象中的结果
        result_len=bytes(str(len(ret)),encoding='utf-8')      #获取结果的长度并转成字节类型
        con.send(result_len)     # 告诉服务器发送内容的长度
        con.sendall(ret)    #发送命令执行的结果   两个send在一起会发生粘包现象,解决方法是将两个send之间加入一个recv阻塞一下
sk.close()

 

posted @ 2020-10-27 20:45  maday  阅读(298)  评论(0)    收藏  举报