• 基于tcp实现远程执行命令


    """
    '''基于tcp实现ntp服务'''
    import time
    from socket import *
    '''服务端'''
    
    ip_port = ('127.0.0.1', 8080)
    buffer_size = 1024
    back_log = 10
    
    tcp_server = socket(AF_INET, SOCK_STREAM)
    
    tcp_server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    
    tcp_server.bind(ip_port)
    
    tcp_server.listen(back_log)
    
    while True:
       conn, addr = tcp_server.accept()
       while True:
          try:
             data = conn.recv(buffer_size) # 此处data为编码后形式的数据
             # print('客户端发送的消息:', data.decode('utf-8'))
             back_time = time.strftime(data.decode('utf-8')) # 需要对data进行解码变成字符串
             conn.send(back_time.encode('utf-8')) # back_time为字符串形式,发送数据需要进行编码
          except Exception:
             break
       conn.close()
    
    tcp_server.close()
    """
    """
    '''基于tcp实现ntp服务'''
    from socket import *
    '''客户端'''
    
    ip_port = ('127.0.0.1', 8080)
    buffer_size = 1024
    
    tcp_client = socket(AF_INET, SOCK_STREAM)
    
    tcp_client.connect(ip_port)
    
    while True:
       msg = input('请输入:').strip()
       if not msg: continue
       tcp_client.send(msg.encode('utf-8'))
       data = tcp_client.recv(buffer_size)
       print('服务端发送的消息:', data.decode('utf-8'))
    
    tcp_client.colse()
    """
    '''基于tcp实现远程执行命令'''
    import subprocess
    from socket import *
    '''服务端'''
    
    ip_port = ('127.0.0.1', 8000)
    back_log = 10
    buffer_size = 1024
    
    tcp_server = socket(AF_INET, SOCK_STREAM)
    
    tcp_server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    
    tcp_server.bind(ip_port)
    
    tcp_server.listen(back_log)
    
    while True:
       conn, addr = tcp_server.accept()
       while True:
          try: # 当客户端点击左下方stop按钮终止链接会报出异常,所以加入try防止程序崩溃
             data = conn.recv(buffer_size)
             print('客户端发送的消息:', data.decode('utf-8'))
             if not data: break # 当客户端输入quit断开链接时,不加此判断会进入死循环
             res = subprocess.Popen(data.decode('utf-8'),
                                    shell=True,
                                    stdout=subprocess.PIPE,
                                    stdin=subprocess.PIPE,
                                    stderr=subprocess.PIPE,)
             # subprocess库中Popen是一个类,能对cmd命令进行执行;stdout是输出信息(命令正确),stderr是错误信息(命令错误),把这些信息放入管道,
             # 然后再通过管道进行拿取;在终端执行不放入管道的话,那么输出信息是直接给了屏幕,而屏幕也是一个程序;
    
             cmd_res = res.stdout.read() # 在管道中读取信息
             if cmd_res:
                conn.send(cmd_res)
             else:
                conn.send(res.stderr.read())
          except Exception:
             break
       conn.close()
    tcp_server.close()
    '''基于tcp实现远程执行命令'''
    from socket import *
    '''客户端'''
    
    ip_port = ('127.0.0.1', 8000)
    buffer_size = 1024
    
    tcp_client = socket(AF_INET, SOCK_STREAM)
    
    tcp_client.connect(ip_port)
    
    while True:
       msg = input('请输入:').strip() # 当获得的信息量比较多时,一次性展示不完,然后后续输入任何信息都可以再次展示其它未展示信息,不知道为什么--->在tcp这属于粘包现象,udp不会粘包,但也会因为recvfrom(1024)读取信息的大小有关
    
       if not msg: continue
    
       if msg == 'quit': break
    
       tcp_client.send(msg.encode('utf-8'))
    
       data = tcp_client.recv(buffer_size)
    
       print('执行命令结果:', data.decode('gbk')) # subprocess.Popen(),由于编码没法设置,所以使用的是系统编码,win系统默认编码是gbk,所以此处解码也应是gbk
    
    tcp_client.close()
    while True: print('studying...')
  • 相关阅读:
    paip.提升性能C#.NET程序内存占用过多以及OutOfMemory解决方法
    ATTILAX项目进展表VC425
    paip.VOB DVD视频的无损分割与截取
    paip.程序不报错自动退出的解决
    paip.TechExcel DevSuite IIS 应用配置
    paip.软件版本完善计划C426fromVC423
    paip.chrome使用ACTIVX 的总结
    PAIP批量改名JS实现
    Source Navigato rNG4.4在ubuntu的简单的安装
    QuartusII编译出错小小总结
  • 原文地址:https://www.cnblogs.com/xuewei95/p/14790979.html
Copyright © 2020-2023  润新知