基于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...')
原文地址:https://www.cnblogs.com/xuewei95/p/14790979.html