Pieni takaovi Flaskissa tai kuinka ohjata tietokonetta paikallisessa verkossa

Hei Habr!

Katsoin äskettäin ladatun version ohjelmointivirrasta "Kuinka luoda oma verkkosovellus Flaskissa". Ja päätin lujittaa tietoni johonkin projektiin. Pitkään en tiennyt mitä kirjoittaa, ja mieleeni tuli ajatus: "Miksi et tekisi minitakaovea Flaskiin?"

Ensimmäiset vaihtoehdot takaoven toteutuksille ja ominaisuuksille ilmestyivät heti päähäni. Mutta päätin tehdä heti luettelon takaoven ominaisuuksista:

  1. Osaa avata verkkosivustoja
  2. Käytä komentoriviä
  3. Pystyy avaamaan ohjelmia, valokuvia, videoita

Ensimmäinen kohta on siis erittäin helppo toteuttaa verkkoselainmoduulin avulla. Päätin toteuttaa toisen pisteen os-moduulin avulla. Ja kolmas on myös os-moduulin kautta, mutta käytän "linkkejä" (sitä lisää myöhemmin).

Kirjoittaa palvelinta

Joten *rummuta* kaikki palvelinkoodi:

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

Olen jo jättänyt kaiken koodin, on aika selittää ydin.

Kaikki koodi suoritetaan paikallisessa tietokoneessa portissa 5000. Jotta voimme olla vuorovaikutuksessa palvelimen kanssa, meidän on lähetettävä JSON POST -pyyntö.

JSON-pyyntörakenne:

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

No, on järkevää, että "komento" on komento, jonka haluamme suorittaa. Ja "data" ovat komentoargumentteja.

Voit kirjoittaa ja lähettää JSON-pyyntöjä ollaksesi vuorovaikutuksessa palvelimen kanssa manuaalisesti (pyynnöt auttavat sinua). Tai voit kirjoittaa konsoliasiakkaan.

Asiakkaan kirjoittaminen

Koodi:

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

Selitykset:

Ensinnäkin pyyntömoduuli tuodaan (palvelimen kanssa vuorovaikutusta varten). Alla on kuvaukset käynnistys- ja testitoiminnoista. Ja sitten sykli, jossa taika tapahtuu. Oletko lukenut koodin? Joten ymmärrät syklissä tapahtuvan taikuuden merkityksen. Anna komento - se suoritetaan. Shell – komentorivin komennot (logiikka ei ole mittakaavassa).

Testaa - tarkista, onko palvelin käynnissä (takaovi)
Linkki – "pikakuvakkeen" käyttö
Openweb – verkkosivuston avaaminen
Lopeta – poistu asiakkaasta
Aseta – tietokoneesi IP:n asettaminen paikalliseen verkkoon

Ja nyt lisää linkistä.

Palvelimen vieressä on link.txt-tiedosto. Se sisältää linkkejä (koko polku) tiedostoihin (videot, valokuvat, ohjelmat).

Rakenne on seuraavanlainen:

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

Koko

Meillä on takaovipalvelin, jolla ohjataan tietokonetta lähiverkossa (wi-fi-verkon sisällä). Teknisesti voimme ajaa asiakasta miltä tahansa laitteelta, jossa on python-tulkki.

PS Lisäsin set-komennon, jotta jos paikallisverkon tietokoneelle on määritetty eri IP-osoite, se voidaan muuttaa suoraan asiakkaassa.

Lähde: will.com

Lisää kommentti