socket实现在python中调用操作系统的命令(subprocess)

liusarazhang 2019-10-22

在python中调用操作系统的命令
import os
import subprocess
# r = os.popen(‘ipconfig‘)
r = subprocess.Popen(‘ls‘,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)、
# subprocess.Popen(cmd,shell=True,subprocess.stdout,subprocess.stderr)
# cmd : 代表系统命令
# shell = True   代表这条命令是 系统命令,告诉操作系统,将cmd当成系统命令去执行
# stdout   是执行完系统命令之后,用于保存结果的一个管道
# stderr   是执行完系统命令之后,用于保存错误结果的一个管道
stdout = r.stdout.read().decode(‘gbk‘)
stderr = r.stderr.read().decode(‘gbk‘)
print(‘正确的返回结果:‘,stdout)
print(‘错误的返回结果:‘,stderr)
print(‘错误的返回结果:‘,stderr)            #保存变量的方法使得能得到两个错误的信息,否则只能得到一次错误的结果


#客户端发送一条命令用于调用服务器的系统命令
    # 客户端发送要执行命令
    # 服务器执行,执行完将结果返回给客户端
    # 客户端拿到结果呈现到用户眼前
#server层
import socket
import subprocess
sk = socket.socket()
sk.bind((‘127.0.0.1‘,8080))
sk.listen()
conn,addr = sk.accept()
while 1:
    cmd = conn.recv(1024).decode(‘utf-8‘)
    r = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    stdout = r.stdout.read()
    stderr = r.stderr.read()
    if stderr:
        conn.send(stderr)
    else:
        conn.send(stdout)
conn.close()
sk.close()

#client层
import socket
sk = socket.socket()
sk.connect_ex((‘127.0.0.1‘,8080))
while 1:
    cmd = input(‘请输入一个命令>>>‘)
    sk.send(cmd.encode(‘utf-8‘))
    #因为服务器是windows,执行的命令是GBK格式,所以传回来后需要进行解码,解码为GBK格式
    result = sk.recv(102400).decode(‘gbk‘)
    print(result)
sk.close()

相关推荐