Flask-dagi kichik orqa eshik yoki mahalliy tarmoqdagi kompyuterni qanday boshqarish kerak

Hey Xabr!

Men yaqinda "Flask-da o'z veb-ilovangizni qanday yaratish kerak" dasturlash oqimining yuklab olingan versiyasini tomosha qildim. Va men bilimlarimni qandaydir loyihada mustahkamlashga qaror qildim. Uzoq vaqt davomida nima yozishni bilmasdim va menga shunday fikr keldi: "Nega Flaskda mini-backdoor yasash kerak?"

Orqa eshikni amalga oshirishning birinchi variantlari va imkoniyatlari darhol mening boshimda paydo bo'ldi. Ammo men darhol orqa eshik imkoniyatlari ro'yxatini tuzishga qaror qildim:

  1. Veb-saytlarni qanday ochishni biling
  2. Buyruqlar qatoriga kirish huquqiga ega bo'ling
  3. Dasturlar, rasmlar, videolarni ocha olish

Shunday qilib, birinchi nuqtani veb-brauzer moduli yordamida amalga oshirish juda oson. Men ikkinchi nuqtani OS moduli yordamida amalga oshirishga qaror qildim. Uchinchisi ham OS moduli orqali, lekin men "havolalar" dan foydalanaman (bu haqda keyinroq).

Server yozish

Shunday qilib, * drumroll * barcha server kodlari:

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

Men allaqachon barcha kodlarni tashlab qo'ydim, mohiyatini tushuntirish vaqti keldi.

Barcha kod mahalliy kompyuterda 5000 portida ishlaydi. Server bilan ishlash uchun biz JSON POST so'rovini yuborishimiz kerak.

JSON so'rovi tuzilishi:

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

Xo'sh, "buyruq" biz bajarmoqchi bo'lgan buyruq ekanligi mantiqan. Va "ma'lumotlar" - bu buyruq argumentlari.

Server bilan qoʻlda ishlash uchun JSON soʻrovlarini yozishingiz va yuborishingiz mumkin (soʻrovlar sizga yordam beradi). Yoki konsol mijozini yozishingiz mumkin.

Mijoz yozish

Kod:

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

Tushuntirishlar:

Avvalo, so'rovlar moduli import qilinadi (server bilan o'zaro ishlash uchun). Quyida boshlash va sinov funksiyalarining tavsiflari keltirilgan. Va keyin sehr sodir bo'ladigan tsikl. Kodni o'qidingizmi? Shunday qilib, siz tsiklda sodir bo'ladigan sehrning ma'nosini tushunasiz. Buyruqni kiriting - u bajariladi. Shell - buyruq qatori uchun buyruqlar (mantiq miqyosdan tashqarida).

Sinov - server ishlayotganligini tekshiring (orqa eshik)
Havola - "yorliq" dan foydalanish
Openweb - veb-sayt ochish
Chiqish - mijozdan chiqish
O'rnatish - mahalliy tarmoqdagi kompyuteringizning IP-ni o'rnatish

Va endi havola haqida ko'proq.

Server yonida link.txt fayli mavjud. Unda fayllarga (videolar, fotosuratlar, dasturlar) havolalar (to'liq yo'l) mavjud.

Tuzilishi quyidagicha:

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

Xulosa

Mahalliy tarmoqdagi (Wi-Fi tarmog'ida) kompyuterni boshqarish uchun bizda orqa eshik serveri mavjud. Texnik jihatdan biz mijozni python tarjimoniga ega har qanday qurilmadan ishga tushirishimiz mumkin.

PS Men o'rnatish buyrug'ini qo'shdim, agar mahalliy tarmoqdagi kompyuterga boshqa IP tayinlangan bo'lsa, uni bevosita mijozda o'zgartirish mumkin.

Manba: www.habr.com

a Izoh qo'shish