باب خلفي صغير على Flask أو كيفية التحكم في جهاز كمبيوتر على شبكة محلية

يا هبر!

لقد شاهدت مؤخرًا نسخة تم تنزيلها من مسار البرمجة "كيفية إنشاء تطبيق الويب الخاص بك في Flask". وقررت توحيد معرفتي في بعض المشاريع. لفترة طويلة لم أكن أعرف ماذا أكتب وجاءت الفكرة في ذهني: "لماذا لا أصنع بابًا خلفيًا صغيرًا في Flask؟"

ظهرت في ذهني على الفور الخيارات الأولى لتطبيقات وقدرات الباب الخلفي. لكنني قررت على الفور إعداد قائمة بإمكانيات الباب الخلفي:

  1. تعرف على كيفية فتح المواقع
  2. لديك الوصول إلى سطر الأوامر
  3. تكون قادرة على فتح البرامج والصور ومقاطع الفيديو

لذا، فإن النقطة الأولى سهلة التنفيذ للغاية باستخدام وحدة متصفح الويب. قررت تنفيذ النقطة الثانية باستخدام وحدة نظام التشغيل. والثالث هو أيضًا من خلال وحدة نظام التشغيل، لكنني سأستخدم "الروابط" (المزيد حول ذلك لاحقًا).

كتابة الخادم

لذلك، *drumroll* كل رمز الخادم:

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

لقد قمت بالفعل بإلقاء كل التعليمات البرمجية، وحان الوقت لشرح الجوهر.

يتم تشغيل كافة التعليمات البرمجية على الكمبيوتر المحلي على المنفذ 5000. للتفاعل مع الخادم، يجب علينا إرسال طلب JSON POST.

هيكل طلب JSON:

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

حسنًا، من المنطقي أن يكون "الأمر" هو الأمر الذي نريد تنفيذه. و"البيانات" هي وسيطات الأمر.

يمكنك كتابة وإرسال طلبات JSON للتفاعل مع الخادم يدويًا (ستساعدك الطلبات). أو يمكنك كتابة عميل وحدة التحكم.

كتابة العميل

كود:

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

التفسيرات:

أولاً، يتم استيراد وحدة الطلبات (للتفاعل مع الخادم). فيما يلي وصف لوظائف البدء والاختبار. ومن ثم الدورة التي يحدث فيها السحر. هل قرأت الكود؟ وبذلك تفهم معنى السحر الذي يحدث في الدورة. أدخل الأمر - تم تنفيذه. Shell – أوامر لسطر الأوامر (المنطق خارج النطاق).

الاختبار - التحقق من تشغيل الخادم (الباب الخلفي)
الرابط - استخدام "الاختصار"
Openweb – فتح موقع على شبكة الإنترنت
إنهاء – الخروج من العميل
Set - ضبط IP لجهاز الكمبيوتر الخاص بك على الشبكة المحلية

والآن المزيد عن الارتباط.

يوجد ملف link.txt بجوار الخادم. يحتوي على روابط (المسار الكامل) للملفات (فيديو، صور، برامج).

الهيكل هو مثل هذا:

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

مجموع

لدينا خادم خلفي للتحكم في جهاز الكمبيوتر على شبكة محلية (داخل شبكة wi-fi). من الناحية الفنية، يمكننا تشغيل العميل من أي جهاز يحتوي على مترجم بايثون.

ملاحظة: لقد أضفت أمر set بحيث إذا تم تعيين عنوان IP مختلف لجهاز كمبيوتر على الشبكة المحلية، فيمكن تغييره مباشرة في العميل.

المصدر: www.habr.com

إضافة تعليق