Mažos užpakalinės durys „Flask“ arba kaip valdyti kompiuterį vietiniame tinkle

Sveiki, Habr!

Neseniai žiūrėjau atsisiųstą programavimo srauto „Kaip sukurti savo žiniatinklio programą „Flask“ versiją. Ir nusprendžiau savo žinias įtvirtinti kokiame nors projekte. Ilgą laiką nežinojau, ką rašyti, ir kilo mintis: „Kodėl kolboje nepadarius mini užpakalinių durų?

Mano galvoje iškart pasirodė pirmieji galinių durų diegimo ir galimybių variantai. Bet aš nusprendžiau nedelsiant sudaryti galinių durų galimybių sąrašą:

  1. Žinokite, kaip atidaryti svetaines
  2. Turėkite prieigą prie komandinės eilutės
  3. Mokėti atidaryti programas, nuotraukas, vaizdo įrašus

Taigi, pirmąjį punktą itin lengva įgyvendinti naudojant žiniatinklio naršyklės modulį. Antrąjį tašką nusprendžiau įgyvendinti naudojant OS modulį. Ir trečiasis taip pat per OS modulį, bet aš naudosiu „nuorodas“ (apie tai vėliau).

Serverio rašymas

Taigi, *drumroll* visas serverio kodas:

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')

Jau išmečiau visą kodą, laikas paaiškinti esmę.

Visas kodas veikia vietiniame kompiuteryje prie 5000 prievado. Norėdami bendrauti su serveriu, turime išsiųsti JSON POST užklausą.

JSON užklausos struktūra:

{‘command’:  ‘comecommand’, ‘data’: ‘somedata’}

Na, prasminga, kad „komanda“ yra komanda, kurią norime vykdyti. O „duomenys“ yra komandos argumentai.

Galite rašyti ir siųsti JSON užklausas, kad galėtumėte bendrauti su serveriu rankiniu būdu (užklausos jums padės). Arba galite parašyti konsolės klientą.

Kliento rašymas

Kodas:

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

Paaiškinimai:

Visų pirma, importuojamas užklausų modulis (sąveikavimui su serveriu). Žemiau pateikiami paleidimo ir testavimo funkcijų aprašymai. Ir tada ciklas, kuriame vyksta magija. Ar perskaitėte kodą? Taigi jūs suprantate cikle vykstančios magijos prasmę. Įveskite komandą – ji vykdoma. Shell – komandos komandinei eilutei (logika yra išjungta).

Testas – patikrinkite, ar serveris veikia (galinės durys)
Nuoroda – „sparčiojo klavišo“ naudojimas
Openweb – svetainės atidarymas
Baigti – išeiti iš kliento
Nustatyti – kompiuterio IP nustatymas vietiniame tinkle

O dabar daugiau apie nuorodą.

Šalia serverio yra failas link.txt. Jame yra nuorodos (visas kelias) į failus (vaizdo įrašus, nuotraukas, programas).

Struktūra yra tokia:

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

Visas

Turime užpakalinių durų serverį, skirtą kompiuteriui valdyti vietiniame tinkle (wi-fi tinkle). Techniškai klientą galime paleisti iš bet kurio įrenginio, kuriame yra python interpretatorius.

PS Pridėjau komandą set, kad jei vietinio tinklo kompiuteriui būtų priskirtas kitas IP, jį būtų galima pakeisti tiesiogiai kliente.

Šaltinis: www.habr.com

Добавить комментарий