当前位置:首页>python>Python实现远程监控电脑实现

Python实现远程监控电脑实现

  • 2026-10-11 06:47:45
Python实现远程监控电脑实现

C/S远程监控工具整体实现思路(客户端exe ↔ 服务端监控程序)

业务目标:

  • 被控端:别人运行你的exe(客户端),启动后自动连接服务器
  • 监控端(你本地程序):连接服务器,查看哪些客户端上线、看到客户端IP、远程浏览磁盘文件、删除文件、屏幕共享

架构选型:中间服务器中转模式(推荐),避免NAT内网无法直连问题。 不建议客户端直接监听端口(被控电脑有防火墙,大部分家用宽带没有公网IP,外部连不进去)。

整体架构:被控客户端exe → 连接 中转服务端 ← 你的监控端GUI程序

  1. 被控客户端主动向外发起TCP长连接连服务器;
  2. 监控端也连接服务器;
  3. 所有指令、屏幕截图、文件数据全部经过服务器转发;
  4. 服务器记录每个上线客户端的IP、连接状态。

整体步骤拆解(分3个程序:中转服务器、被控客户端、监控GUI)

步骤1:搭建中转服务器程序(Python,部署在有公网的机器,云服务器)

  1. 使用Python socket / asyncio 写TCP服务,监听固定端口(例如 8899)
  2. 维护客户端连接池字典:{client_id: {"socket":conn, "ip":"120.x.x.x", "online":True}}
  3. 区分两种接入身份:
    • 被控客户端(agent):上线注册,上报本机IP,保持长连接心跳包(3‑5秒心跳,判断掉线)
    • 监控端(controller,你自己的GUI):登录认证,下发控制指令给指定agent
  4. 服务器只做消息转发,不执行业务逻辑:
    • 监控端发指令 → 服务器转发给对应被控端
    • 被控端执行完,结果/截图/文件列表回传给服务器 → 转发给监控端
  5. 简单消息协议:自定义json消息,示例
{"cmd":"screenshot","target_agent_id":"agent001","data":""}

⚠️安全:增加简单token密钥,不管被控端还是监控端,连接上来必须携带密钥,防止外人接入你的服务器。

服务器部署:阿里云/腾讯云轻量服务器,开放端口防火墙;也可以用家里电脑做服务器,但需要公网IP/内网穿透,不稳定,正式场景用云服务器。

步骤2:被控客户端(要打包成exe给别人运行)

功能清单

  1. 程序启动,后台运行(可以无窗口,或者最小化),使用asyncio持续向中转服务器建立TCP长连接;断线自动重连。
  2. 发送心跳包维持连接,上报本机对外IP、本机计算机名。
  3. 接收服务器转发过来的指令,本地执行:
    • 指令1:获取磁盘文件列表 → 调用os模块扫描本地目录,把目录结构json传回
    • 指令2:删除文件 → os/shutil删除文件
    • 指令3:屏幕截图 → PIL/Pillow截取屏幕,图片base64编码传回
    • 指令4:获取文件(下载被控端文件);上传文件
  4. 打包为exe:pyinstaller,可以设置后台运行‑w参数,不弹出黑窗口。

依赖库:

  • pillow:屏幕截图
  • asyncio:tcp长连接
  • json:消息序列化

风险提醒:这个程序行为就是远控软件,不要未经许可部署到别人电脑,法律风险极高,只能用于自己可控机器测试。

步骤3:你的监控GUI程序(本地运行,前面做的文件管理器GUI改造扩展)

GUI基于Tkinter/PyQt开发,功能:

  1. 连接中转服务器,携带密钥登录。
  2. 上线主机列表面板:实时展示所有在线agent:agent编号、公网IP、内网IP、计算机名、上线时间;服务器推送上下线事件,列表自动刷新。
  3. 选中一台被控主机:
    1. 远程资源浏览:发送指令,拿到被控端磁盘目录json数据,渲染成文件管理器界面(复用你刚才写的文件管理器UI),可以双击浏览远程目录,右键删除远程文件。
    2. 屏幕共享:循环下发截图指令,接收base64图片,GUI界面持续渲染图片,实现屏幕查看;如果要鼠标远程控制,额外发送鼠标坐标、点击事件指令下发给被控端。
    3. 文件上传下载:二进制流传输文件。

步骤4:通信协议设计(简单json协议)

全部消息用JSON,通过TCP传输,每条消息结尾加换行符\n作为消息分隔,避免粘包。

示例消息类型:

  1. agent上线注册
{"type":"register","token":"mytest123","agent_name":"PC‑ZhangSan"}
  1. 监控端获取在线主机
{"type":"get_online_agent","token":"mytest123"}
  1. 监控端下发指令获取远程目录
{"type":"command","target_agent_id":"agent1","cmd":"list_dir","params":{"path":"C:\\"}}
  1. 被控端返回目录数据
{"type":"response","agent_id":"agent1","data":[{"type":"folder","name":"Windows"},{"type":"file","name":"a.txt"}]}
  1. 截图指令
{"type":"command","target_agent_id":"agent1","cmd":"screenshot"}

步骤5:关键技术点

  1. 粘包问题:TCP字节流没有边界,每条json后面加\n换行,接收端按换行分割每条json数据包。
  2. 断线重连:被控客户端网络断开,自动sleep几秒重连服务器。心跳包,超过10秒没有心跳,服务器标记客户端离线。
  3. 图片传输:截图图片二进制base64编码放在json;大图会很大,可以做图片压缩,降低分辨率。
  4. 文件传输:不能直接放json,分开二进制流,先传文件元信息(文件名、大小),再传输二进制块。
  5. 安全问题
    • 必须token密钥认证,防止陌生人连接你的服务器操控主机。
    • TCP明文传输,抓包可以看到全部指令,进阶可以加AES加密所有json内容。

步骤6:打包交付

  1. 被控客户端:pyinstaller -F -w agent.py → 生成exe,发给目标机器运行。

-w 无控制台窗口,后台运行;调试的时候去掉‑w看日志。

  1. 中转服务器部署在云服务器上,持续后台运行。
  2. 监控端GUI,本地运行,连接服务器进行管控。

可选两种替代方案

  1. 不使用云服务器:内网穿透把服务器运行在你自己电脑,使用frp,被控端通过frp穿透访问你本机服务;缺点你电脑必须一直开机。

  2. P2P直连(不推荐) 被控端、监控端直接P2P打洞,不需要中间服务器;但是内网成功率低,很多网络环境打洞失败。

模块对应库清单

功能
库
TCP网络通信
asyncio(推荐,异步长连接)/socket
截图
Pillow(PIL)
GUI监控端
tkinter / PyQt6
消息序列化
json
加密(可选)
pycryptodome AES加密报文
打包exe
pyinstaller

⚠️法律风险重点提示

远程控制程序,只能用于自己拥有、获得明确授权的设备测试。未经用户知情许可,在他人电脑部署远控程序属于违法行为。

最新文章

随机文章