Python——通过socket远程执行命令 (subprocess模块)

Python执行命令模块 subprocess

Python可以使用subprocess下的Popen类中的封装的方法来执行命令

API方法

  • 构造方法 popen() 创建popen类的实例化对象
    ···
    obj = Subprocess.Popen(data,shell=True,stdout=subprocess.PIPE)
  • data 命令内容
  • shell 开启shell
  • stdout 重定向结果输出管道
    * PIPE 将结果转移到当前主进程
    *
    ···
  • stdout.read() 获取命令执行的结果,指定结果后会将执行结果封装到指定的对象中,然后通过对象,read()获取执行命令的结果,如果不定义stdout会将结果进行标准输出
import subprocess
popen = subprocess.Popen('pwd',shell=True,stdout=subprocess.PIPE)
print(popen.stdout.read())

通过socket远程调用执行命令并返回结果

  • server
'''
通过socket远程调用执行命令并返回
'''
import socket

# 创建socket对象
import subprocess

sk = socket.socket()
address = ('127.0.0.1', 8000)
# 绑定地址
sk.bind(address)
sk.listen(3)
conn, address = sk.accept()
while 1:
    # 接收数据
    data = conn.recv(1024)
    # 转换字符串
    cm_data = str(data, 'utf8')
    print(cm_data)
    # 执行命令
    sp = subprocess.Popen(cm_data, shell=True, stdout=subprocess.PIPE)
    run_result = sp.stdout.read()
    # 为了将数据全部发送 先发送长度
    run_result_len = len(run_result)
    conn.sendall(bytes(str(run_result_len), 'utf8'))
    # 将命令执行结果发送回去
    conn.sendall(run_result)

conn.close()
sk.close()
  • client
'''
远程执行命令客户端
'''
import socket

sk = socket.socket()
address = ('127.0.0.1', 8000)
# 设置地址
sk.connect(address)
while True:
    # 发送数据
    inpt = input('>>>')
    # 数据转换
    input_byte = bytes(inpt, 'utf8')
    # 发送数据
    sk.sendall(input_byte)
    # 接收返回结果的长度
    len_recv = sk.recv(1024)
    print(len_recv)
    run_len = int(str(len_recv, 'utf8'))
    print("run_len" + str(run_len))
    # 存放接收数据的容器变量
    recv_data = bytes()
    while len(recv_data) != run_len:
        data = sk.recv(1024)
        recv_data += data
    # 接收数据
    run_result = str(recv_data, 'utf8')
    print(run_result)
sk.close()

你可能感兴趣的:(Python——通过socket远程执行命令 (subprocess模块))