zoukankan      html  css  js  c++  java
  • 基于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...')
  • 相关阅读:
    牛客小白月赛29 种树 题解(思维)
    E
    D
    方格取数(number) 题解(dp)
    csust T1097 “是时候表演真正的技术了” 题解(虚点跑最短路)
    poj 2352 Stars
    poj 3321 Apple Tree
    poj 3067 Japan
    poj 1195 Mobile phones
    poj 2155 Matrix
  • 原文地址:https://www.cnblogs.com/xuewei95/p/14790979.html
Copyright © 2011-2022 走看看