0%

《Anywherectl开发笔录》Anywhere开发第一天

背景

Anywherectl被定义为一个远程控制工具,即使双方都处于各自的局域网中,也能达到控制目的,代价是需要一个server端(什么是server端,后面会讲到)

今天是开发的第一天,我为什么会想到开发这样一个工具,绝大部分产品都是因为需求而生的,Anywherectl也不例外。

我即是现处公司的程序猿,兼职运维工程师。我有很多的权限,但是其他开发小伙伴不一样,他们甚至没有看线上日志的权限。

我一个小伙伴这周末加班,因为某种原因,他加班做的这个事情需要频繁观察线上日志,但是他没有权限,而我又不加班,运维工程师也不加班,平时他都是找我查看线上日志,但是这次就很不便利。

所以我在回家的路上就想,如果他能操控我电脑,并拥有有限的权限,我只要开着电脑,他不就可以自行查看日志了吗。

首先我想到了TeamViewer,但是它不能有权限的精细控制,比如我只能让他在我机器上运行 “ls” 命令,它做不到。

因此,Anywherectl即刻萌芽。

我希望它可以做到权限的精细控制,精细到每一个shell命令。

我希望它可以实现做到两台各自局域网中的机器也能操控,因为小伙伴的电脑和我的电脑都在局域网中,都没有公网ip,也没有路由器的控制权限。

我甚至希望它以后能有传输文件的功能。

好了,我们开始吧,前方高能,做好脑补的准备。

架构设计

这里的架构非常简单,相比很多公司的大型系统

架构图

架构图1

server应该部署到公网中,listener以及client都通过简单的token进行授权连接

listener与server之间保持长连接,双向通信,listener具有断开重连机制,server承担心跳责任

client与server之间是一次性连接,请求含义是:调用哪个listener做什么事情。需要附带server的token以及想要使用的listener的token

listener启动后将其配置的公开权限(比如哪个token可以执行哪些命令)注册到server,server检查每个client调用是否有权限

启动命令设计

server

1
anywherectl serve -tcp-address=0.0.0.0:8181 -listener-token=test_token -client-token=test -log-level=debug

listener

1
anywherectl listen -name=pefish -server-token=test_token -server-address=0.0.0.0:8181 -config=/path/to/config.yaml

client

1
anywherectl -listener-name=pefish -listener-token=token_test -server-token=test_token -server-address=0.0.0.0:8181 -action=shell -data=ls

应用层协议设计

版本号(4字节)+server token(32字节)+listener name(32字节)+listener token(32字节)+命令(32字节)+参数长度(4字节)+参数(可变长,由||分割)

协议头

  1. 版本号: 协议版本号
  2. server token: 连接server的授权token
  3. listener name: listener连接server时表示listener自己的名字,client连接server时表示client要控制的listener名字
  4. listener token: client控制listener的授权token
  5. 命令
  6. 参数长度

协议体

  1. 参数

listener -> server

命令有:

  1. REGISTER: 参数有 client tokens of listener
  2. SHELL_RESULT: 参数有 clientUuid、指令(1 接收数据,2 shell结束)、data
  3. PONG:无参数

server -> listener

命令有:

  1. REGISTER_OK: 无参数
  2. REGISTER_FAIL:参数有 失败原因
  3. SHELL:参数有 clientUuid、shell命令
  4. PING:无参数
  5. VERSION_ERROR
  6. TOKEN_ERROR
  7. CLIENT_CLOSED:通知listener,server与client之间的连接已经关闭

client -> server

命令有:

  1. SHELL: 参数有data

server -> client

命令有:

  1. RESULT: 参数有result
  2. LISTENER_NOT_FOUND
  3. UNAUTHORIZE

Github链接

https://github.com/pefish/anywherectl

欢迎一起开发




微信关注我,及时接收最新技术文章