Hola Habr!
Hace poco vi la versi贸n descargada de la secuencia de programaci贸n "C贸mo construir su aplicaci贸n web de matraz". Y decidi贸 consolidar su conocimiento en alg煤n proyecto. Durante mucho tiempo no supe qu茅 escribir y se me ocurri贸 la idea: "驴Por qu茅 no hacer una mini puerta trasera en Flask?".
Las primeras opciones para la implementaci贸n y las capacidades de la puerta trasera aparecieron de inmediato en mi cabeza. Pero decid铆 hacer inmediatamente una lista de caracter铆sticas de puerta trasera:
- Poder abrir sitios
- Tener acceso a la l铆nea de comando
- Poder abrir programas, fotos, videos
Entonces, el primer elemento es extremadamente f谩cil de implementar usando el m贸dulo webbrowser. El segundo punto que decid铆 implementar usando el m贸dulo os. Y el tercero tambi茅n es a trav茅s del m贸dulo os, pero usar茅 "enlaces" (m谩s sobre eso m谩s adelante).
Ortograf铆a del servidorEntonces * drum roll * todo el c贸digo del servidor:
from flask import Flask, request import webbrowser import os import re app = Flask(__name__) @app.route('/mycomp', methods=['POST']) def hell(): json_string = request.json if json_string['command'] == 'test': return 'The server is running and waiting for commands...' if json_string['command'] == 'openweb': webbrowser.open(url='https://www.'+json_string['data'], new=0) return 'Site opening ' + json_string['data'] + '...' if json_string['command'] == 'shell': os.system(json_string['data']) return 'Command execution ' + json_string['data'] + '...' if json_string['command'] == 'link': links = open('links.txt', 'r') for i in range(int(json_string['data'])): link = links.readline() os.system(link.split('>')[0]) return 'Launch ' + link.split('>')[1] if __name__ == '__main__': app.run(host='0.0.0.0')
Ya descart茅 todo el c贸digo, es hora de explicar la esencia.
Todo el c贸digo se ejecuta en la computadora local en el puerto 5000. Para interactuar con el servidor, debemos enviar una solicitud JSON POST.
Estructura de solicitud JSON:
{'command': 'comecommand', 'data': 'somedata'}
Bueno, es l贸gico que 'comando' sea el comando que queremos ejecutar. Y 'datos' son los argumentos del comando.
Puede escribir y enviar solicitudes JSON para interactuar con el servidor con l谩pices (las solicitudes lo ayudan). O puede escribir un cliente de consola.
Escritura del clienteC贸digo:
import requests logo = ['\n\n', '****** ********', '******* *********', '** ** ** **', '** ** ** ** Written on Python', '******* ** **', '******** ** **', '** ** ** ** Author: ROBOTD4', '** ** ** **', '** ** ** **', '******** *********', '******* ********', '\n\n'] p = '' iport = '192.168.1.2:5000' host = 'http://' + iport + '/mycomp' def test(): dict = {'command': 'test', 'data': 0} r = requests.post(host, json=dict) if r.status_code == 200: print (r.content.decode('utf-8')) def start(): for i in logo: print(i) start() test() while True: command = input('>') if command == '': continue a = command.split() if command == 'test': dict = {'command': 'test', 'data': 0} r = requests.post(host, json=dict) if r.status_code == 200: print (r.content.decode('utf-8')) if a[0] == 'shell': for i in range(1, len(a)): p = p + a[i] + ' ' dict = {'command': 'shell', 'data': p} r = requests.post(host, json=dict) if r.status_code == 200: print (r.content.decode('utf-8')) p = '' if a[0] == 'link': if len(a) > 1: dict = {'command': 'link', 'data': int(a[1])} r = requests.post(host, json=dict) if r.status_code == 200: print (r.content.decode('utf-8')) else: print(' !') if a[0] == 'openweb': if len(a) > 1: dict = {'command': 'openweb', 'data': a[1]} r = requests.post(host, json=dict) if r.status_code == 200: print (r.content.decode('utf-8')) else: print(' !') if a[0] == 'set': if a[1] == 'host': ip = a[2] + ':5000' if command == 'quit': break
Explicaciones
El primer paso es importar el m贸dulo de solicitudes (para interactuar con el servidor). Descripci贸n adicional de las funciones de inicio y prueba. Y luego el ciclo en el que ocurre la magia. 驴Has le铆do el c贸digo? Entonces, el significado de la magia que ocurre en el ciclo es claro para ti. Ingrese el comando: se ejecuta. Shell: comandos para la l铆nea de comando (la
l贸gica va por las nubes ).
Prueba: compruebe si el servidor funciona (puerta trasera)
Enlace - usando un atajo
Openweb - apertura del sitio web
Salir - salir del cliente
Establecer: configure la direcci贸n IP de su computadora en la red local
Y ahora m谩s sobre el enlace.
Al lado del servidor est谩 el archivo link.txt. Contiene enlaces (ruta completa) a archivos (videos, fotos, programas).
La estructura es la siguiente:
_>
_>
Resumen
Tenemos un servidor de puerta trasera para controlar una computadora en una red local (dentro de una red wi-fi). T茅cnicamente, podemos ejecutar el cliente desde cualquier dispositivo que tenga un int茅rprete de Python.
PD: agregu茅 el comando set para que si se asigna una ip diferente a una computadora en la red local, se puede cambiar directamente en el cliente.