快看,这有一款远程访问工具!

前言

来啦老铁!

有段时间没写东西了,跟大家分享一个最近弄的远程访问工具吧!

先睹为快:

远程访问工具

学习路径

一、背景;
二、技术选型;
三、介绍与演示;
四、遗留事项;

一、背景;

我所在的项目组,硬件连接在 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;
前端主页 html
  • 也可以找个服务器,启个 nginx 服务,然后配置好路由即可作为 web 前端服务;

d. 使用该远程访问工具;

远程访问工具
  • 页面选择 agent 即可自动检查 agent 是否可连接;
自动检查 agent 是否可连接 1
自动检查 agent 是否可连接 2
  • 点击 “Conduct” 按钮会自动 cd 到默认的目录下,并执行输入的 Command;
Conduct

其中左侧是执行 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,左右滑动可改变输出框与截图大小比例。

右滑
左滑

四、遗留事项;

  1. 后端代码并没有将 controller 与 service 分开,而是直接在 controller 中写了,笔者图快,无所谓就是,规范一点还是得写个 service 层;

  2. 后端中,对远程机器的操作都是针对 windows 机器的,没有对其他机器进行兼容,例如 MacOS 电脑等,这个有需要用到的朋友要自行扩展补充了。不过好在pyautogui 支持多种操作系统,包括 Windows、Mac OS 和 Linux,只是部分键鼠操作需要调整适配一下。

有些人可能会觉得手搓这样一个工具很费劲,轮子造得有点大,我不反对。

但目前我没有找到其他更好的办法,权且仅当作编程练手,这本身就是一件好事,更何况在后端实现中,我还初次见识到了实现桌面自动化的工具 pyautogui,更是好上加好!

当然,如果读者朋友们有更好的办法,欢迎在评论区告知,我一定虚心学习,谢谢了~

好了,今天就记录到这里啦,下期再见~

如果本文对您有帮助,麻烦动动手指点点赞?

谢谢!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容