'n Klein agterdeur op Flask of hoe om 'n rekenaar op 'n plaaslike netwerk te bestuur

Haai Habr!

Ek het onlangs 'n afgelaaide weergawe van die programmeringstroom gekyk "Hoe om jou eie webtoepassing in Flask te skep." En ek het besluit om my kennis in een of ander projek te konsolideer. Ek het lank nie geweet wat om te skryf nie en die idee het by my opgekom: "Hoekom nie 'n mini-agterdeur in Flask maak nie?"

Die eerste opsies vir implementering en vermoëns van die agterdeur het dadelik in my kop verskyn. Maar ek het besluit om dadelik 'n lys van agterdeur-vermoëns te maak:

  1. Weet hoe om webwerwe oop te maak
  2. Het opdragreëltoegang
  3. In staat wees om programme, foto's, video's oop te maak

Dus, die eerste punt is uiters maklik om te implementeer met behulp van die webblaaiermodule. Ek het besluit om die tweede punt te implementeer deur die os-module te gebruik. En die derde een is ook deur die os-module, maar ek sal "skakels" gebruik (meer daaroor later).

Bediener skryf

Dus, *drumroll* al die bedienerkode:

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

Ek het reeds al die kode uitgegooi, dit is tyd om die essensie te verduidelik.

Alle kode loop op die plaaslike rekenaar op poort 5000. Om met die bediener te kommunikeer, moet ons 'n JSON POST-versoek stuur.

Versoek JSON-struktuur:

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

Wel, dit maak sin dat 'bevel' die opdrag is wat ons wil uitvoer. En 'data' is die bevelargumente.

Jy kan JSON-versoeke skryf en stuur om handmatig met die bediener te kommunikeer (versoeke sal jou help). Of jy kan 'n konsole-kliënt skryf.

Skryf 'n kliënt

Kode:

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

Verduidelikings:

Eerstens word die versoekmodule ingevoer (vir interaksie met die bediener). Hieronder is beskrywings van die begin- en toetsfunksies. En dan die siklus waarin die magie gebeur. Het jy die kode gelees? So jy verstaan ​​die betekenis van die magie wat in die siklus gebeur. Voer die opdrag in - dit word uitgevoer. Shell – opdragte vir die opdragreël (die logika is van skaal af).

Toets - kyk of die bediener loop (agterdeur)
Skakel - gebruik van "kortpad"
Openweb - webwerf opening
Stop - verlaat die kliënt
Stel - stel die ip van jou rekenaar op die plaaslike netwerk

En nou in meer besonderhede oor skakel.

Daar is 'n link.txt-lêer langs die bediener. Dit bevat skakels (volledige pad) na lêers (video's, foto's, programme).

Die struktuur is soos volg:

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

Totale

Ons het 'n agterdeurbediener om 'n rekenaar op 'n plaaslike netwerk (binne 'n wi-fi-netwerk) te beheer. Tegnies kan ons die kliënt bestuur vanaf enige toestel wat 'n luislang-tolk het.

NS Ek het die stel opdrag bygevoeg sodat as 'n rekenaar op die plaaslike netwerk 'n ander IP toegeken word, dit direk in die kliënt verander kan word.

Bron: will.com

Voeg 'n opmerking