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
  • 相关阅读:
    【XSY3905】字符串题(lyndon串,构造)
    【XSY3904】直线(分块)
    收藏的数学网址
    Music!
    Codeforces Global Round 12
    Codeforces Round #698 (Div. 2)
    Codeforces Round #727 (Div. 2)
    Croatian Open Competition in Informatics (COCI) 2020/2021 — Round #2
    Tokio Marine & Nichido Fire Insurance Programming Contest 2021 (AtCoder Regular Contest 122)
    NowCoder IOI 周赛 26 [提高组]
  • 原文地址:https://www.cnblogs.com/dangrui0725/p/9479097.html
Copyright © 2011-2022 走看看