Una pequeña puerta trasera en Flask o cómo controlar una computadora en una red local

¡Hola, Habr!

Recientemente vi una versión descargada del flujo de programación "Cómo crear su propia aplicación web en Flask". Y decidí consolidar mis conocimientos 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 implementaciones y capacidades de la puerta trasera aparecieron inmediatamente en mi cabeza. Pero decidí hacer inmediatamente una lista de capacidades de puerta trasera:

  1. Sepa cómo abrir sitios web.
  2. Tener acceso a la línea de comando
  3. Poder abrir programas, fotos, vídeos.

Entonces, el primer punto es extremadamente fácil de implementar usando el módulo del navegador web. Decidí implementar el segundo punto usando el módulo os. Y el tercero también es a través del módulo os, pero usaré “enlaces” (más sobre esto más adelante).

Escribiendo un servidor

Entonces, *redoble de tambores* 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 dejé 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, tiene sentido que 'comando' sea el comando que queremos ejecutar. Y los 'datos' son los argumentos del comando.

Puede escribir y enviar solicitudes JSON para interactuar con el servidor manualmente (las solicitudes lo ayudarán). O puede escribir un cliente de consola.

Escribiendo un cliente

Código:

import requests

logo = ['nn',
        '******      ********',
        '*******     *********',
        '**    **    **     **',
        '**    **    **     **      Written on Python',
        '*******     **     **',
        '********    **     **',
        '**     **   **     **      Author: ROBOTD4',
        '**     **   **     **',
        '**     **   **     **',
        '********    *********',
        '*******     ********',
        'nn']

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:

En primer lugar, se importa el módulo de solicitudes (para interactuar con el servidor). A continuación se encuentran descripciones de las funciones de inicio y prueba. Y luego el ciclo en el que ocurre la magia. ¿Has leído el código? Entonces entiendes el significado de la magia que sucede en el ciclo. Ingrese el comando: se ejecuta. Shell: comandos para la línea de comando (la lógica está fuera de escala).

Prueba: compruebe si el servidor se está ejecutando (puerta trasera)
Enlace – uso de un “atajo”
Openweb: abrir un sitio web
Salir – salir del cliente
Establecer: configurar la IP de su computadora en la red local

Y ahora más sobre el enlace.

Hay un archivo link.txt al lado del servidor. Contiene enlaces (ruta completa) a archivos (vídeos, fotos, programas).

La estructura es así:

полный_путь>описание
полный_путь>описание

Total

Disponemos de un servidor de puerta trasera para controlar una computadora en una red local (dentro de una red wifi). Técnicamente, podemos ejecutar el cliente desde cualquier dispositivo que tenga un intérprete de Python.

PD: Agregué el comando set para que si a una computadora en la red local se le asigna una IP diferente, se pueda cambiar directamente en el cliente.

Fuente: habr.com

Añadir un comentario