Helló, Habr!
Nemrég megnéztem egy letöltött élő közvetítést a "Hogyan készítsünk webalkalmazást Flask segítségével" téma körében. Elhatároztam, hogy egy projektben megerősítem tudásomat. Hosszasan gondolkodtam, mit írjak, és jött az ötlet: "Miért ne csinálnék egy mini hátsó ajtót Flask alapján?"
Azonnal megjelentek a fejemben az első megvalósítási lehetőségek és a hátsó ajtó lehetőségei. De először is elhatároztam, hogy összeállítok egy listát a hátsó ajtó lehetőségeiről:
- Weboldalak megnyitása
- Hozzáférés a parancssorhoz
- Programok, képek, videók megnyitása
Az első pont rendkívül egyszerűen megvalósítható a webbrowser modul segítségével. A második pont megvalósításához az os modult választottam. A harmadik pontot szintén az os modul segítségével fogom végrehajtani, de 'linkeket' fogok használni (erről később).
Írás a szerver
Tehát, *tampere tambura* itt van a teljes szerverkód:
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 'A szerver működik és várja a parancsokat...'
if json_string['command'] == 'openweb':
webbrowser.open(url='https://www.'+json_string['data'], new=0)
return 'Weboldal megnyitása ' + json_string['data'] + '...'
if json_string['command'] == 'shell':
os.system(json_string['data'])
return 'Parancs végrehajtás ' + 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 'Indítás: ' + link.split('>')[1]
if __name__ == '__main__':
app.run(host='0.0.0.0')
Már megmutattam az összes kódot, ideje elmagyarázni a lényeget.
Az összes kód a helyi számítógépen fut 5000-es porton. Az interakcióhoz szerverrel JSON POST kéréseket kell küldenünk.
A JSON kérés struktúrája:
{‘command’: ‘comecommand’, ‘data’: ‘somedata’}Nos, logikus, hogy a ‘command’ az a parancs, amelyet végre akarunk hajtani. A ‘data’ pedig a parancs argumentumai.
JSON kéréseket lehet írni és küldeni a szerverrel való kölcsönhatás érdekében (az requests segíthet). Vagy lehet írni egy konzol klienst.
Kliens írása
Kód:
import requests
logo = ['nn',
'****** ********',
'******* *********',
'** ** ** **',
'** ** ** ** Írva Pythonban',
'******* ** **',
'******** ** **',
'** ** ** ** Szerző: 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('A parancs nem tartalmaz argumentumokat!')
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('A parancs nem tartalmaz argumentumokat!')
if a[0] == 'set':
if a[1] == 'host':
ip = a[2] + ':5000'
if command == 'quit':
break
Magyarázatok:
Első lépésben importáljuk a requests modult (a szerverrel való interakcióhoz). Ezután a start és a test függvények leírása következik. Majd egy ciklus, amely végzi a varázslatot. Olvastátok a kódot? Akkor világos, mi a varázslat a ciklusban. Írjátok be a parancsot – végrehajtódik. Shell – parancsok a parancssorhoz (a logika csúcsra hág).
Test – ellenőrzés, hogy működik-e a szerver (hátsó kapu)
Link – a "parancsikon" használata
Openweb – weboldal megnyitása
Quit – kilépés a kliensből
Set – a számítógép IP-címének beállítása a helyi hálózaton
Most részletesebben a linkről.
A szerver mellett található a link.txt fájl. Ebben találhatóak a fájlokhoz (videók, fényképek, programok) vezető linkek (teljes út).
A struktúra a következő:
teljes_út>leírás
teljes_út>leírás
Result
Van egy hátsó kapus kiszolgálónk a számítógép helyi hálózaton való irányításához (a wi-fi hálózaton belül). Technikailag bármilyen eszközről indíthatjuk a klienst, amelyen van python értelmező.
P.S. A set parancsot azért adtam hozzá, hogy ha a helyi hálózaton a számítógép másik IP-t kap, akkor közvetlenül a kliensben módosíthassuk.
Forrás: habr.com
