首页 > 编程语言 > 详细

python基础—socket套接字(4)基于tcp实现远程执行命令

时间:2020-12-27 19:29:02      阅读:30      评论:0      收藏:0      [点我收藏+]

1.python运行shell命令要用到一个模块subpross。模块允许你生成新的进程,连接它们的输入、输出、错误管道,并且获取它们的返回码

如:在cmd执行ipconfig命令

import subprocess

# 创建子程序
subprocess_obj = subprocess.Popen(ipconfig,
                                  shell=True,
                                  stdout=subprocess.PIPE,
                                  stderr=subprocess.PIPE
                                  )
‘‘‘当shell=True时,表示在系统默认的shell环境中执行新的进程,此shell在windows表示为cmd.exe,在linux为/bin/sh
subprocess.PIPE表示打开标准流的管道
stdout从子进程捕获到的标准输出. 一个字节序列, 或一个字符串
stderr捕获到的子进程的标准错误. 一个字节序列, 或者一个字符串,
‘‘‘
stdout_res = subprocess_obj.stdout.read()  # 读取输出结果。标准输出是byte类型
stderr_res = subprocess_obj.stderr.read()
print(stdout_res.decode(gbk))#windows默认编码为gbk
print(stderr_res.decode(gbk))

技术分享图片

 

2.有了subpross,在上两次课的基础上修改即可。

 

#服务端
import socket
import subprocess

socket_obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_obj.bind((127.0.0.1, 8080))
socket_obj.listen(5)
while True:
    fd, addr = socket_obj.accept()
    try:
        while True:
            cmd = fd.recv(1024)
            obj = subprocess.Popen(
                cmd.decode(utf8),
                shell=True,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE

            )
            stdout_res = obj.stdout.read()  # 标准输出是byte格式,widows是gbk编码
            stderr_res = obj.stderr.read()
            print(stdout_res.decode(gbk))
            print(stderr_res.decode(gbk))
            fd.send(stdout_res)
            fd.send(stderr_res)
    except ConnectionResetError:
        print(客户端关闭)

    fd.close()
#客户端
import socket

client_obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_obj.connect((127.0.0.1, 8080))
while True:
    cmd = input(请输入cmd命令:).strip()
    if not cmd: continue
    client_obj.send(cmd.encode(utf8))

    cmd_res = client_obj.recv(1024)
    print(cmd_res.decode(gbk))

如果客户端运行的结果比较大,超过了recv的大小,客户端接收不干净,造成粘包了,怎么处理呢?

 

python基础—socket套接字(4)基于tcp实现远程执行命令

原文:https://www.cnblogs.com/liaoyifu/p/14197875.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!