前言
来啦老铁!
有段时间没写东西了,跟大家分享一个最近弄的远程访问工具吧!
先睹为快:
学习路径
一、背景;
二、技术选型;
三、介绍与演示;
四、遗留事项;
一、背景;
我所在的项目组,硬件连接在 windows 机器上,这台 windows 作为自动化的 agent 执行 CI 上自动化的部分,同时 windows 上需要开第三方软件配合测试,如果在该 windows 上调试代码(例如调查问题),则容易对测试产生干扰,例如既想在执行脚本的时候看日志输出和代码,这就会因为不同窗口会互相遮挡,从而对测试产生干扰,因此需要一款能远程与 windows 沟通的桥梁。
在初期,我调研搜集了几个选项用于解决该痛点:
1. 使用远程桌面软件 RealVNC Viewer/TeamViewer 等:该方式并不能解决“容易对测试产生干扰”这个痛点,因为远程桌面软件本质上只是把远程桌面带到你本地,你在远程桌面软件上的操作等同于直接在 windows 电脑上直接操作。
2. 使用 python 相关库发送命令到远程电脑:例如 paramiko,正常这个是可以的,不过我的自动化项目有些截图、录屏相关的动作,在使用 paramiko 的时候会在截图、录屏相关操作的时候报错,怀疑是跟远程调用有关:
因此,这个方案也不合适!
由于市面上也没有找到类似能解决我痛点的软件或工具,因此,我决定自己开发一款,同时也练练手,编程一下~
3. 手搓一款远程访问工具!
首先,搭建一个后端,用于接收前端请求,并根据请求在后端所在机器操作上执行对应操作,例如在后台执行 cmd 命令、模拟键鼠操作等,还有一个很重要的点,能够“实时”将执行结果返回给前端,以便用户及时查看结果;
其次,手搓一个前端,提供良好的交互界面,用于接受用户想在远程机器执行的指令,并能监视远程机器的表现。
2. 技术选型;
后端:
本次采用前段时间刚接触的 FastAPI(一个用于构建 API 的现代、快速(高性能)的 web 框架,专为在 Python 中构建 RESTful API 而设计。),具体使用方法可参考之前文章:
后端代码:https://github.com/dylanz666/debug-bridge-server.git
前端:
由于页面少,功能也不多,出于轻量考虑,本次不使用任何前端框架,直接手搓一个,即:html + css + js 实现;
前端代码:https://github.com/dylanz666/debug-bridge-client.git
3. 介绍与演示;
1). 启动后端;
在你的服务器端执行以下操作:
a. git clone https://github.com/dylanz666/debug-bridge-server.git
b. pip install -r requirements.txt
c. uvicorn main:app --host 0.0.0.0 --port 8001 --log-config log-config.yaml 或 ppython main.py 8001 或 python start_server.py 或双击 start_server.bat 或双击 restart_server.bat
d. 在你的本地浏览器访问服务器地址,例如 1.2.3.4:8001,看到 "success" 字眼就说明后端启动成功了;
2). 前端部分;
a. git clone https://github.com/dylanz666/debug-bridge-client.git
b. 修改后端服务配置;
注:
1是对你的后端服务别命名,2是你在后端服务器上执行命令的默认目录,可选,3是你后端服务的 ip 地址以及端口,如果有 DNS 解析,这里也可以配置网址;
c. 打开前端主页 html;
- 直接浏览器打开前端仓库中的 index.html;
- 也可以找个服务器,启个 nginx 服务,然后配置好路由即可作为 web 前端服务;
d. 使用该远程访问工具;
- 页面选择 agent 即可自动检查 agent 是否可连接;
- 点击 “Conduct” 按钮会自动 cd 到默认的目录下,并执行输入的 Command;
其中左侧是执行 Command 之后的“实时”输出,右边是对远程服务器界面的截图;
鼠标移入右侧截图区域,可知道当前鼠标在远程机器的位置,当移入截图区域,则可在该区域执行键鼠操作,例如鼠标左键点击、右键点击、选择文本(也可实现拖动效果)、键盘输入文本、键盘输入组合键 ctrl+c,ctrl+v 等,并在完成键鼠操作后自动更新截图。
Zoom In 按钮可放大截图;
Live 按钮实现了实时截图效果(笔者实现为每 1 秒中截图一次,可自行在前端代码中调整);
底部是对每次 Command 操作的记录(每次记录进程 pid),可中断执行、清空记录、加载记录等,同时,如果 120 次 Command 返回都是相同内容,则停止自动加载 Command 输出,120 次大概是 2 分钟内(笔者设计为每 1 秒钟更新一次 Command 输出)。
可使用 Load Content、Load All Content 手动加载该 Command 进程产生的输出。
页面底部还有一个滑块 slider,左右滑动可改变输出框与截图大小比例。
四、遗留事项;
后端代码并没有将 controller 与 service 分开,而是直接在 controller 中写了,笔者图快,无所谓就是,规范一点还是得写个 service 层;
后端中,对远程机器的操作都是针对 windows 机器的,没有对其他机器进行兼容,例如 MacOS 电脑等,这个有需要用到的朋友要自行扩展补充了。不过好在pyautogui 支持多种操作系统,包括 Windows、Mac OS 和 Linux,只是部分键鼠操作需要调整适配一下。
有些人可能会觉得手搓这样一个工具很费劲,轮子造得有点大,我不反对。
但目前我没有找到其他更好的办法,权且仅当作编程练手,这本身就是一件好事,更何况在后端实现中,我还初次见识到了实现桌面自动化的工具 pyautogui,更是好上加好!
当然,如果读者朋友们有更好的办法,欢迎在评论区告知,我一定虚心学习,谢谢了~
好了,今天就记录到这里啦,下期再见~
如果本文对您有帮助,麻烦动动手指点点赞?
谢谢!