Python結(jié)合Flask框架構(gòu)建一個(gè)簡(jiǎn)易的遠(yuǎn)程控制系統(tǒng)
1.概述
隨著信息化進(jìn)程的加速,遠(yuǎn)程控制和系統(tǒng)管理工具越來(lái)越受到關(guān)注。尤其在企業(yè)環(huán)境中,管理員需要通過(guò)遠(yuǎn)程方式對(duì)計(jì)算機(jī)系統(tǒng)進(jìn)行管理和維護(hù)。本文將詳細(xì)介紹如何使用Python與Flask框架構(gòu)建一個(gè)簡(jiǎn)易的遠(yuǎn)程控制系統(tǒng)。這個(gè)系統(tǒng)不僅能夠遠(yuǎn)程執(zhí)行操作命令(如關(guān)機(jī)、重啟、鎖屏等),還具備實(shí)時(shí)屏幕截圖功能,適合用于學(xué)習(xí)與開(kāi)發(fā)小型遠(yuǎn)程控制工具。
通過(guò)實(shí)現(xiàn)這一功能,我們不僅能夠深入理解Flask的使用,還能實(shí)踐一些與操作系統(tǒng)交互的命令執(zhí)行技術(shù)。本文還會(huì)講解開(kāi)發(fā)過(guò)程中遇到的一些技術(shù)難題,并分享如何進(jìn)行修復(fù)和優(yōu)化。
2.功能使用
雙擊運(yùn)行exe文件運(yùn)行后臺(tái)服務(wù),在瀏覽器中訪問(wèn)服務(wù)器中ip地址及固定端口,即可實(shí)現(xiàn)遠(yuǎn)程控制系統(tǒng)功能。
系統(tǒng)命令執(zhí)行
本遠(yuǎn)程控制系統(tǒng)的核心功能是通過(guò)HTTP請(qǐng)求來(lái)遠(yuǎn)程執(zhí)行系統(tǒng)命令。具體包括以下操作:
關(guān)機(jī)與重啟:
- 使用Windows自帶的shutdown命令實(shí)現(xiàn)關(guān)機(jī)和重啟功能。
- shutdown /s /t 0:立即關(guān)機(jī)。
- shutdown /r /t 0:立即重啟。
鎖屏:通過(guò)rundll32.exe user32.dll,LockWorkStation命令鎖定當(dāng)前用戶的屏幕。
清空回收站:使用PowerShell命令Clear-RecycleBin清空系統(tǒng)回收站。
禁用防火墻:通過(guò)REG ADD命令修改注冊(cè)表,禁用Windows防火墻服務(wù)。
刪除休眠文件:通過(guò)powercfg -h off命令關(guān)閉系統(tǒng)休眠功能,從而刪除休眠文件。
延遲window更新:通過(guò)更改注冊(cè)表更改windows延遲最大天數(shù)到54321天來(lái)無(wú)限推遲windows更新,重啟后生效。
win10右鍵/win11右鍵切換:無(wú)縫切換win11右鍵菜單風(fēng)格以及恢復(fù)win10右鍵風(fēng)格。
實(shí)時(shí)屏幕截圖:使用Pillow庫(kù)的ImageGrab.grab()方法截取當(dāng)前屏幕,并通過(guò)Flask返回給客戶端。
關(guān)閉代理:
- 使用VPN后電腦開(kāi)機(jī)瀏覽器網(wǎng)頁(yè)訪問(wèn)請(qǐng)求失敗,可以試著點(diǎn)這個(gè)功能修復(fù)。
- 每個(gè)功能都通過(guò)一個(gè)獨(dú)立的路由實(shí)現(xiàn),用戶只需要點(diǎn)擊對(duì)應(yīng)按鈕,系統(tǒng)就會(huì)在后臺(tái)執(zhí)行命令,并反饋操作結(jié)果。
實(shí)時(shí)屏幕監(jiān)控
通過(guò)Flask,我們實(shí)現(xiàn)了一個(gè)實(shí)時(shí)的屏幕監(jiān)控功能。每3秒,客戶端頁(yè)面會(huì)請(qǐng)求一次服務(wù)器,獲取當(dāng)前屏幕的截圖,并更新頁(yè)面顯示。這一功能對(duì)于遠(yuǎn)程桌面控制、設(shè)備監(jiān)控等場(chǎng)景具有很大的應(yīng)用潛力。
截圖功能的實(shí)現(xiàn)依賴于Pillow庫(kù)的ImageGrab.grab()方法,這是一個(gè)強(qiáng)大的圖像捕獲工具,適合在Windows系統(tǒng)中截取當(dāng)前屏幕。為了減少服務(wù)器的負(fù)擔(dān)和網(wǎng)絡(luò)帶寬的壓力,我們可以考慮對(duì)截圖進(jìn)行壓縮處理,尤其是在高分辨率的環(huán)境下。
3. BUG修復(fù)過(guò)程
在開(kāi)發(fā)過(guò)程中,我們遇到了一些技術(shù)挑戰(zhàn),其中最主要的幾個(gè)問(wèn)題如下:
1. Authorization認(rèn)證失敗
在實(shí)現(xiàn)API的認(rèn)證時(shí),我們通過(guò)在HTTP請(qǐng)求的Authorization頭部傳遞API密鑰進(jìn)行驗(yàn)證。初步實(shí)現(xiàn)時(shí),認(rèn)證機(jī)制似乎工作正常,但我們發(fā)現(xiàn)有時(shí)即使API密鑰正確,某些請(qǐng)求仍然無(wú)法通過(guò)驗(yàn)證。經(jīng)檢查,問(wèn)題出在瀏覽器的緩存機(jī)制上。為了避免緩存帶來(lái)的問(wèn)題,我們修改了前端代碼,在每次請(qǐng)求時(shí)動(dòng)態(tài)更新請(qǐng)求URL(通過(guò)添加時(shí)間戳),確保每次請(qǐng)求都是最新的。
2. 截圖質(zhì)量差
在實(shí)現(xiàn)屏幕截圖功能時(shí),我們發(fā)現(xiàn)直接返回截圖時(shí)圖片質(zhì)量較差,尤其是在高分辨率屏幕上。為了解決這個(gè)問(wèn)題,我們對(duì)圖像進(jìn)行無(wú)損壓縮,以保持較高的圖像質(zhì)量,同時(shí)又不占用過(guò)多的帶寬。
修復(fù)代碼:
image.save(buffer, format='PNG') # 無(wú)損PNG格式
通過(guò)這種方式,圖像的質(zhì)量得到了有效提升,且不會(huì)對(duì)性能造成過(guò)大影響。
3. 系統(tǒng)命令執(zhí)行延遲
在執(zhí)行系統(tǒng)命令時(shí),尤其是涉及到重啟、關(guān)機(jī)等操作,subprocess.run()方法可能會(huì)存在一定的延遲。這主要是因?yàn)閳?zhí)行這些命令會(huì)啟動(dòng)新的進(jìn)程,導(dǎo)致主進(jìn)程暫時(shí)阻塞。為了解決這個(gè)問(wèn)題,我們采用了異步方式執(zhí)行這些命令,避免了用戶在執(zhí)行命令時(shí)界面的卡頓。
修復(fù)代碼:
subprocess.Popen(command, shell=True) # 異步執(zhí)行命令
這種方式提高了響應(yīng)速度,確保了系統(tǒng)在執(zhí)行命令時(shí)能夠流暢地響應(yīng)其他請(qǐng)求。
4. 運(yùn)行效果
服務(wù)端開(kāi)啟效果
手機(jī)瀏覽器端效果:
PC端瀏覽器效果:
5.相關(guān)源碼
from flask import Flask, render_template_string, request, jsonify, send_file import subprocess import os import io from PIL import ImageGrab, Image app = Flask(__name__) API_KEY = "your_secure_key_here" # 替換成你的密鑰 HTML_PAGE = """ <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>遠(yuǎn)程控制系統(tǒng)</title> <style> body { font-family: Arial, sans-serif; padding: 20px; background: #f4f4f4; } h2 { text-align: center; } .button-container { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; margin-bottom: 20px; } button { padding: 12px; border: none; background: #007BFF; color: white; border-radius: 5px; cursor: pointer; } button:hover { background: #0056b3; } #status { text-align: center; margin-top: 20px; color: green; } #screenshot { display: block; margin: 20px auto; max-width: 100%; border: 1px solid #ccc; } </style> </head> <body> <h2>遠(yuǎn)程控制面板</h2> <div class="button-container"> <button onclick="sendCommand('shutdown')">關(guān)機(jī)</button> <button onclick="sendCommand('reboot')">重啟</button> <button onclick="sendCommand('lock_screen')">鎖屏</button> <button onclick="sendCommand('clear_recycle_bin')">清空回收站</button> <button onclick="sendCommand('disable_firewall')">禁用防火墻</button> <button onclick="sendCommand('disable_proxy')">關(guān)閉代理</button> <button onclick="sendCommand('disable_hibernation')">刪除休眠文件</button> <button onclick="sendCommand('delay_windows_update')">延遲更新</button> <button onclick="sendCommand('change_win10_context_menu')">Win10右鍵菜單</button> <button onclick="sendCommand('restore_win11_context_menu')">Win11右鍵菜單</button> </div> <h3>實(shí)時(shí)屏幕監(jiān)控</h3> <button onclick="refreshScreenshot()">查看屏幕截圖</button> <img id="screenshot" src="" alt="屏幕截圖"> <p id="status"></p> <script> function sendCommand(action) { fetch('/' + action, { method: 'POST', headers: { 'Authorization': 'Bearer your_secure_key_here' } }) .then(response => response.json()) .then(data => document.getElementById("status").innerText = data.message) .catch(() => document.getElementById("status").innerText = "請(qǐng)求失敗"); } function refreshScreenshot() { const img = document.getElementById('screenshot'); img.src = '/screenshot?time=' + new Date().getTime(); // 防止緩存 } setInterval(refreshScreenshot, 3000); // 每3秒自動(dòng)刷新截圖 window.onload = refreshScreenshot; // 頁(yè)面加載時(shí)刷新截圖 </script> </body> </html> """ # ----------------- 安全認(rèn)證 ----------------- def check_auth(): return request.headers.get("Authorization", "") == f"Bearer {API_KEY}" # ----------------- 系統(tǒng)控制命令 ----------------- @app.route('/') def home(): return render_template_string(HTML_PAGE) @app.route('/shutdown', methods=['POST']) def shutdown(): return run_command("shutdown /s /t 0", "關(guān)機(jī)命令已執(zhí)行") @app.route('/reboot', methods=['POST']) def reboot(): return run_command("shutdown /r /t 0", "重啟命令已執(zhí)行") @app.route('/lock_screen', methods=['POST']) def lock_screen(): return run_command("rundll32.exe user32.dll,LockWorkStation", "鎖屏命令已執(zhí)行") @app.route('/clear_recycle_bin', methods=['POST']) def clear_recycle_bin(): return run_command('powershell -Command "Clear-RecycleBin -Confirm:$false"', "回收站已清空") @app.route('/disable_firewall', methods=['POST']) def disable_firewall(): return run_command('REG ADD "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\mpssvc" /v Start /t REG_DWORD /d 4 /f', "防火墻已禁用") @app.route('/disable_proxy', methods=['POST']) def disable_proxy(): return run_command('REG ADD "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings" /v ProxyEnable /t REG_DWORD /d 0 /f', "全局代理已關(guān)閉") @app.route('/disable_hibernation', methods=['POST']) def disable_hibernation(): return run_command("powercfg -h off", "休眠文件已刪除") @app.route('/delay_windows_update', methods=['POST']) def delay_windows_update(): cmd = 'reg add "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\WindowsUpdate\\UX\\Settings" /v "FlightSettingsMaxPauseDays" /t REG_DWORD /d 54321 /f' return run_command(cmd, "Windows 更新已延遲") @app.route('/change_win10_context_menu', methods=['POST']) def change_win10_context_menu(): cmd = 'reg add "HKCU\\Software\\Classes\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\\InprocServer32" /f /ve & taskkill /f /im explorer.exe & start explorer.exe' return run_command(cmd, "Win10 右鍵菜單已更改") @app.route('/restore_win11_context_menu', methods=['POST']) def restore_win11_context_menu(): cmd = 'reg delete "HKCU\\Software\\Classes\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}" /f & taskkill /f /im explorer.exe & start explorer.exe' return run_command(cmd, "Win11 右鍵菜單已恢復(fù)") # ----------------- 截圖接口 (無(wú)壓縮) ----------------- @app.route('/screenshot') def screenshot(): try: image = ImageGrab.grab() buffer = io.BytesIO() image.save(buffer, format='PNG') # 無(wú)損PNG格式 buffer.seek(0) return send_file(buffer, mimetype='image/png') except Exception as e: return jsonify({"message": f"截圖失敗: {str(e)}"}), 500 # ----------------- 命令執(zhí)行 ----------------- def run_command(command, success_message): if not check_auth(): return jsonify({"message": "未授權(quán)"}), 401 try: subprocess.run(command, shell=True, check=True) return jsonify({"message": success_message}), 200 except Exception as e: return jsonify({"message": f"操作失敗: {str(e)}"}), 500 # ----------------- 啟動(dòng) ----------------- if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
6.總結(jié)
本文展示了如何使用Python和Flask構(gòu)建一個(gè)簡(jiǎn)單的遠(yuǎn)程控制系統(tǒng),能夠遠(yuǎn)程執(zhí)行系統(tǒng)命令、截圖以及進(jìn)行屏幕監(jiān)控。通過(guò)這次開(kāi)發(fā)實(shí)踐,我們不僅熟悉了Flask的使用,還深入了解了如何與操作系統(tǒng)交互,并處理一些常見(jiàn)的開(kāi)發(fā)難題。
在開(kāi)發(fā)過(guò)程中,我們不僅解決了認(rèn)證、截圖質(zhì)量、命令延遲等問(wèn)題,還深入了解了如何優(yōu)化Web應(yīng)用的性能和用戶體驗(yàn)。然而,值得注意的是,這個(gè)系統(tǒng)主要適用于Windows操作系統(tǒng),對(duì)于Linux或Mac用戶,需要針對(duì)不同平臺(tái)進(jìn)行適配。
最后,雖然這個(gè)遠(yuǎn)程控制系統(tǒng)具備了基本的功能,但它依然存在一定的安全隱患。例如,API密鑰的暴露可能導(dǎo)致不法分子進(jìn)行惡意操作,因此在實(shí)際部署中,建議進(jìn)一步加強(qiáng)安全機(jī)制(如使用OAuth認(rèn)證、數(shù)據(jù)加密等)。此外,考慮到大規(guī)模部署,系統(tǒng)的穩(wěn)定性、性能以及擴(kuò)展性也是我們需要關(guān)注的重點(diǎn)。
在未來(lái)的開(kāi)發(fā)中,我們還可以考慮增加更多功能,如多用戶管理、實(shí)時(shí)消息推送、操作記錄日志等,使得系統(tǒng)更加完善和可靠。
以上就是Python結(jié)合Flask框架構(gòu)建一個(gè)簡(jiǎn)易的遠(yuǎn)程控制系統(tǒng)的詳細(xì)內(nèi)容,更多關(guān)于Python遠(yuǎn)程控制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
簡(jiǎn)單了解Python matplotlib線的屬性
這篇文章主要介紹了簡(jiǎn)單了解Python matplotlib線的屬性,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-06-06安裝pyhttpx解決ImportError: DLL load failed錯(cuò)誤
這篇文章主要為大家介紹了安裝pyhttpx解決ImportError: DLL load failed錯(cuò)誤,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08Python中的簡(jiǎn)寫操作(for、if簡(jiǎn)寫、匿名函數(shù))
這篇文章主要介紹了Python中的簡(jiǎn)寫操作(for、if簡(jiǎn)寫、匿名函數(shù)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Python多項(xiàng)式回歸的實(shí)現(xiàn)方法
這篇文章主要介紹了Python多項(xiàng)式回歸的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03Python中的True,False條件判斷實(shí)例分析
這篇文章主要介紹了Python中的True,False條件判斷的用法,實(shí)例分析了針對(duì)不同數(shù)據(jù)類型的條件判斷用法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01Python爬蟲過(guò)程解析之多線程獲取小米應(yīng)用商店數(shù)據(jù)
這篇文章主要介紹了Python爬蟲過(guò)程解析之多線程獲取小米應(yīng)用商店數(shù)據(jù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11