image

0x01 前言

因手里云主机比较多,没有固定的办公电脑,导致我经常找不到服务器 IP ,也经常想不起来密码,甚至忘了名下到底有多少台服务器,于是跟小伙伴发了一个能协同使用的在线终端工具,自用的不亦乐乎。

后来发现身边不少朋友都有同样的困扰,于是决定做一个公开服务——牧云·主机管理助手,上线刚刚一个月就有超过 1000 个朋友注册使用,心甚慰,这篇文章将揭秘设计开发思路,欢迎同为技术爱好者前来体验交流~

在线体验:https://rivers.chaitin.cn/workbench?promotion=a46555d83883b379c6e77c7a085dc1da

0x02 面临的挑战

做技术的朋友肯定都熟悉终端,终端是管理计算机最简单直接的方式。为了让自己用起来更爽一点,我们决定对终端做一些加工,整理了一下,主要是下面几个问题需要解决:

  • 能连接远程服务器的终端

    • 服务器没有公网 IP 也要能连

    • 不开 ssh 服务也要能连

  • 支持对终端做远程协助

    • 多人同时对同一个终端进行操作

    • 观看远程操作时能复制终端里的文本

    • 支持录制终端操作,能反复观看

  • 安全性

    • 可以使用账号密码登录,可以对指定用户免密登录

    • 需要在服务器留下标准登录日志

0x03 设计思路

1. 服务端

服务端架构相对简单,在服务器上安装 Agent,用 Agent 拉起本地终端,用一台公网服务器做中转,通Websocket 将终端的输入输出喂给前端,参考下图:

image

2. Web 终端

Web 终端采用 Xterm.js,轮子不错,使用体验和本地终端基本一致,省了很多事,就是有几个小问题:

  • Bug 不少,字体偶尔会跑飞

  • 性能有点拉跨,依赖 GPU,屏幕越大越卡

  • 受浏览器限制,Ctrl-w 和 esc 没法用

3. Agent

Agent 的部分,直接用 login 命令搞定

  1. login 程序直接调用就有一个看起来还不错的登录界面

  2. login -f 就能直接跳过密码认证免密登录

  3. login 自己会把登录日志写到 btmp 和 wtmp 里

这样一来 login 程序完全满足需求,只需要把 login 进程的 stdint/stdout/stderr 和网络连接绑定起来就可以。不过也有小问题:centos 默认开了 selinux,会对 login 的登录行为有干扰,root 无法使用密码登录。

4. 协同方案

关于如何多人协作使用终端的问题,tmate 是目前被广泛使用的方案,但是不符合我们的要求,我们想要的方案:

  1. 不依赖 ssh 或其他客户端

  2. 不依赖公网环境,可穿透内网

  3. 可以选择 ”只能观看终端“ 和 ”可以操作终端“ 两种模式

  4. 能支持文件上传下载

实现其实非常简单,只需要把 Agent 的输入输出复制出来,分别发给不同的 Websocket 就可以,参考下图:

image

几个细节处理一下就可以用了:

  • 多人使用时,每个人的屏幕大小不同,需要同步调整 col 和 row

  • 加入分享时如果一直没有输入可能会什么也看不到,需要缓存一下输出流的历史信息

  • 全屏应用如果只刷新局部,加入分享时看起来也会比较奇怪

  • 等等...

0x04 使用说明

  1. 微信扫码登录百川平台

https://rivers.chaitin.cn/workbench?promotion=a46555d83883b379c6e77c7a085dc1da

  1. 绑定你的主机

image

  1. 点击在线终端 > 分享按钮,可以一键生成访问链接。

image

在另一个浏览器里打开分享链接,这时候就可以两边同步操作了,如丝一般顺滑。

image

这里就结束了。朋友们提比较多的“支持管理 Windows 主机”功能已经在内测,预计近期上线;私有化版本正在计划中;等待功能相对完善后,项目源码最终会以开源的方式回馈技术社区。期待更多的朋友前来体验交流~

results matching ""

    No results matching ""