Mlango mdogo wa nyuma kwenye Flask au jinsi ya kudhibiti kompyuta kwenye mtandao wa ndani

Habari Habr!

Hivi majuzi nilitazama toleo lililopakuliwa la mtiririko wa programu "Jinsi ya kuunda programu yako ya wavuti kwenye Flask." Na niliamua kujumuisha maarifa yangu katika mradi fulani. Kwa muda mrefu sikujua cha kuandika na wazo lilinijia: "Kwa nini usifanye mlango mdogo wa nyuma kwenye Flask?"

Chaguzi za kwanza za utekelezaji na uwezo wa mlango wa nyuma mara moja zilionekana kichwani mwangu. Lakini niliamua mara moja kutengeneza orodha ya uwezo wa nyuma:

  1. Jua jinsi ya kufungua tovuti
  2. Pata ufikiaji wa mstari wa amri
  3. Kuwa na uwezo wa kufungua programu, picha, video

Kwa hivyo, hatua ya kwanza ni rahisi sana kutekeleza kwa kutumia moduli ya kivinjari. Niliamua kutekeleza hoja ya pili kwa kutumia moduli ya os. Na ya tatu pia ni kupitia moduli ya os, lakini nitatumia "viungo" (zaidi juu ya hilo baadaye).

Kuandika seva

Kwa hivyo, *drumroll* nambari zote za seva:

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

Tayari nimetupa nambari zote, ni wakati wa kuelezea kiini.

Nambari zote zinaendeshwa kwenye kompyuta ya ndani kwenye bandari 5000. Ili kuingiliana na seva, lazima tutume ombi la JSON POST.

Muundo wa ombi la JSON:

{β€˜command’:  β€˜comecommand’, β€˜data’: β€˜somedata’}

Kweli, inaeleweka kuwa 'amri' ndio amri tunayotaka kutekeleza. Na 'data' ni hoja za amri.

Unaweza kuandika na kutuma maombi ya JSON ili kuingiliana na seva mwenyewe (maombi yatakusaidia). Au unaweza kuandika mteja wa console.

Kuandika mteja

Code:

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

Maelezo:

Kwanza kabisa, moduli ya maombi inaingizwa (kwa kuingiliana na seva). Hapo chini kuna maelezo ya kazi za kuanza na za majaribio. Na kisha mzunguko ambao uchawi hutokea. Je, umesoma kanuni? Kwa hivyo unaelewa maana ya uchawi unaotokea katika mzunguko. Ingiza amri - inatekelezwa. Shell - amri kwa mstari wa amri (mantiki iko mbali na kiwango).

Jaribu - angalia ikiwa seva inaendesha (nyuma ya nyuma)
Kiungo - matumizi ya "njia ya mkato"
Openweb - kufungua tovuti
Acha - toka kwa mteja
Weka - kuweka ip ya kompyuta yako kwenye mtandao wa ndani

Na sasa zaidi kuhusu kiungo.

Kuna faili ya link.txt karibu na seva. Ina viungo (njia kamili) kwa faili (video, picha, programu).

Muundo ni kama hii:

ΠΏΠΎΠ»Π½Ρ‹ΠΉ_ΠΏΡƒΡ‚ΡŒ>описаниС
ΠΏΠΎΠ»Π½Ρ‹ΠΉ_ΠΏΡƒΡ‚ΡŒ>описаниС

Jumla ya

Tuna seva ya nyuma ya kudhibiti kompyuta kwenye mtandao wa ndani (ndani ya mtandao wa wi-fi). Kitaalam, tunaweza kuendesha mteja kutoka kwa kifaa chochote ambacho kina mkalimani wa python.

PS Niliongeza amri iliyowekwa ili ikiwa kompyuta kwenye mtandao wa ndani imepewa IP tofauti, inaweza kubadilishwa moja kwa moja kwa mteja.

Chanzo: mapenzi.com

Kuongeza maoni