zoukankan      html  css  js  c++  java
  • socket 基于tcp实现远程执行命令

    server.py

    # socket 基于tcp实现远程执行命令
    
    from socket import *
    import subprocess
    
    ip_port = ('127.0.0.1', 8080)
    back_log = 5
    buffer_size = 1024
    
    tcp_server = socket(AF_INET, SOCK_STREAM)
    tcp_server.bind(ip_port)
    tcp_server.listen(back_log)
    
    while True:
        conn, addr = tcp_server.accept()
        while True:
            try:
                cmd = conn.recv(buffer_size)
                if not cmd: break
                cmd = cmd.decode('utf-8')
                print('收到客户端命令', cmd)
                res = subprocess.Popen(cmd, shell=True,  # 第一个参数:命令字符串,第二个参数指定由shell处理
                                       stderr=subprocess.PIPE,  # 将基本的输入、输出及错误都放入管道
                                       stdin=subprocess.PIPE,  # 这些在管道里的信息都是字节形式,编码为utf-8
                                       stdout=subprocess.PIPE
                                       )
                err = res.stderr.read()  # 定义一个err变量接收基本的错误信息
                if err:  # 如果错误信息不为空
                    cmd_res = err  # 输出的结果为基本的错误信息
                else:
                    cmd_res = res.stdout.read()  # 输出的结果为基本的输出信息
    
                if not cmd_res:  # 有些命令无返回结果,需要进行判断
                    cmd_res = '该命令没有返回结果'.encode('gbk')
                conn.send(cmd_res)  # 向客户端发送执行的结果
            except Exception:
                break
    
        conn.close()
    
    tcp_server.close()

    client.py

    from socket import *
    
    ip_port = ('127.0.0.1', 8080)
    
    tcp_client = socket(AF_INET, SOCK_STREAM)
    tcp_client.connect(ip_port)
    
    while True:
        cmd = input('请输入命令').strip()
        if not cmd: continue
        if cmd == 'quit': break
        cmd = cmd.encode('utf-8')
        tcp_client.send(cmd)
        cmd_res = tcp_client.recv(1024) # 这里会有粘包现象产生
        print('命令执行的结果是', cmd_res.decode('gbk'))    # windows系统默认编码为gbk
  • 相关阅读:
    取出session中的所有属性与值的方法
    jqGrid几个需要注意的默认设置
    java语言中除数为零问题
    java语言中Object转为String的几种形式
    highCharts提示框不显示的问题
    jqGrid使用setColProp方法动态改变列属性
    jgGrid中的editrules使用函数来进行验证
    大坝安全监测系统预警值上下限设定
    谓词 (NSPredicate)使用详情
    kvc(键-值编码)
  • 原文地址:https://www.cnblogs.com/dangrui0725/p/9479097.html
Copyright © 2011-2022 走看看