Flask'ta küçük bir arka kapı veya yerel ağdaki bir bilgisayarın nasıl kontrol edileceği

Ey Habr!

Yakın zamanda "Flask'ta kendi web uygulamanızı nasıl oluşturabilirsiniz" programlama akışının indirilmiş bir versiyonunu izledim. Ve bilgilerimi bir projede pekiştirmeye karar verdim. Uzun süre ne yazacağımı bilemedim ve aklıma şu fikir geldi: "Neden Flask'ta mini bir arka kapı yapmıyorsunuz?"

Arka kapının uygulama ve yeteneklerine ilişkin ilk seçenekler hemen kafamda belirdi. Ancak hemen arka kapı yeteneklerinin bir listesini yapmaya karar verdim:

  1. Web sitelerinin nasıl açılacağını bilin
  2. Komut satırı erişimine sahip olun
  3. Programları, fotoğrafları, videoları açabilme

Yani, ilk noktayı web tarayıcısı modülünü kullanarak uygulamak son derece kolaydır. İkinci noktayı os modülünü kullanarak uygulamaya karar verdim. Üçüncüsü de os modülü aracılığıyladır, ancak ben "bağlantıları" kullanacağım (bununla ilgili daha sonra detaylı bilgi vereceğim).

Sunucu yazma

Yani, *drumroll* tüm sunucu kodunu:

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

Zaten tüm kodu attım, özü açıklamanın zamanı geldi.

Tüm kod yerel bilgisayarda 5000 numaralı bağlantı noktasında çalışır. Sunucuyla etkileşim kurmak için bir JSON POST isteği göndermeliyiz.

JSON istek yapısı:

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

'Komut'un yürütmek istediğimiz komut olması mantıklıdır. Ve 'veri' komut argümanlarıdır.

Sunucuyla manuel olarak etkileşim kurmak için JSON istekleri yazıp gönderebilirsiniz (istekler size yardımcı olacaktır). Veya bir konsol istemcisi yazabilirsiniz.

Müşteri yazma

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

Açıklamalar:

Öncelikle istekler modülü içe aktarılır (sunucuyla etkileşim için). Aşağıda başlatma ve test fonksiyonlarının açıklamaları bulunmaktadır. Ve sonra sihrin gerçekleştiği döngü. Kodu okudunuz mu? Böylece döngüde meydana gelen büyünün anlamını anlıyorsunuz. Komutu girin - yürütülür. Kabuk – komut satırı komutları (mantık ölçek dışıdır).

Test – sunucunun çalışıp çalışmadığını kontrol edin (arka kapı)
Bağlantı – “kısayol” kullanımı
Openweb – bir web sitesi açmak
Çık – istemciden çık
Ayarla – bilgisayarınızın IP'sini yerel ağda ayarlama

Ve şimdi bağlantı hakkında daha fazla bilgi.

Sunucunun yanında bir link.txt dosyası var. Dosyalara (videolar, fotoğraflar, programlar) bağlantılar (tam yol) içerir.

Yapı şu şekildedir:

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

sonuç

Yerel ağdaki (wi-fi ağı içindeki) bir bilgisayarı kontrol etmek için bir arka kapı sunucumuz var. Teknik olarak istemciyi python yorumlayıcısı olan herhangi bir cihazdan çalıştırabiliriz.

Not: Yerel ağdaki bir bilgisayara farklı bir IP atanmışsa, doğrudan istemciden değiştirilebilmesi için set komutunu ekledim.

Kaynak: habr.com

Yorum ekle