• 练习——网络编程2


    用subprocess(子进程)模块完成远程cmd操作

    # 客户端
    import socket
    
    client = socket.socket()
    client.connect(('127.0.0.1',8889))
    
    while True:
        cmd = input('请发送命令:').strip()
        if len(cmd) == 0:
            continue
    
        if cmd == 'q':
            client.send(b'q')
            break
    
        cmd = cmd.encode('utf-8')
        client.send(cmd)
    
        byte_data = client.recv(1024)
        print(byte_data.decode('gbk'))
    
    # 服务端
    
    import socket
    import subprocess
    
    server = socket.socket()
    server.bind(('127.0.0.1',8889))
    server.listen(5)
    while True:
        conn,addr = server.accept()
    
        while True:
            try:
                cmd = conn.recv(1024)
                if len(cmd) == 0:
                    continue
    
                cmd = cmd.decode('utf-8')
                if cmd == 'q':break
                obj = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)  # 这里cmd必须是字符串类型,不是bytes类型的字符串
                print(obj)  # <subprocess.Popen object at 0x00000000029C6D30>   对象
    
                # print(obj.stdout.read())  # b'' 没赋值变量名返回的是空
                success = obj.stdout.read()  # 必须赋值一个变量才有值
                # print(success)  #  返回的是二进制,可以直接基于网络传输
    
                # print(obj.stderr.read())  # b'' 没赋值变量名返回的是空
                error = obj.stderr.read()
                # print(error)  # 返回不正确命令的报错信息
    
                if success:
                    conn.send(success)
                else:
                    conn.send(error)
            except Exception as e:  # 捕获客服端人为断开连接,不至于服务端报错率而断开,毕竟服务端是24h不间断服务的
                print(e)
                break
        conn.close()
  • 相关阅读:
    python中的itertools模块简单使用
    SQLServer链接服务器
    @Valid和@Validated的区分总结
    禅道完成高成资本独家领投的数千万元融资
    青岛敏捷之旅,来了!
    linux主机互信操作
    小白学标准库之 mux
    小白学标准库之 flag
    音频截取分割打点标注工具
    大数据可能面试题
  • 原文地址:https://www.cnblogs.com/binyuanxiang/p/11710195.html
Copyright © 2020-2023  润新知