GoTTY 使用指南:如何将终端分享到 Web 端

文章首发于个人公号:「阿拉平平」

最近正值项目上线,项目采用微服务架构并通过 K8s 落地,但某个服务启动后始终存在问题,于是开发要求进入容器排查。从运维的角度而言,开发不应该连接线上环境的服务器,于是我找到了 GoTTY。

项目介绍

GoTTY[1] 是一个基于 Golang 开发的 WebTTY。通过 GoTTY 执行的命令,其结果不会在终端输出,而是显示到 Web 端。本文将介绍 GoTTY 的使用方法。

下载安装

根据系统,下载对应的最新包,这里我下载的版本为 v1.0.1。

[root@localhost ~]# wget https://github.com/yudai/gotty/releases/download/v1.0.1/gotty_linux_amd64.tar.gz

解压并移动到 $PATH 中:

[root@localhost ~]# tar -zxf gotty_linux_amd64.tar.gz
# 注意解压后的文件是否有可执行权限,没有的话要加上
[root@localhost ~]# chmod +x gotty
[root@localhost ~]# mv gotty /usr/local/bin/

查看 GoTTY 的版本:

[root@localhost ~]# gotty --version
gotty version 1.0.1

使用说明

安装好后,让我们来看看要如何使用 GoTTY。

基本用法

GoTTY 的使用非常简单,方法如下:

USAGE:
   gotty [options]  []

只需在要执行的命令前加上 gotty,GoTTY 便会创建网络连接,并监听 8080 端口。以查看磁盘空间为例:

[root@localhost ~]# gotty df -h
2021/06/22 15:00:00 Server is starting with command: df -h
2021/06/22 15:00:00 URL: http://127.0.0.1:8080/
2021/06/22 15:00:00 URL: http://[::1]:8080/
2021/06/22 15:00:00 URL: http://192.168.128.134:8080/
2021/06/22 15:00:00 URL: http://[fe80::7246:6047:4d9f:84b6]:8080/
2021/06/22 15:00:00 URL: http://192.168.122.1:8080/

之后通过浏览器就可以查看结果:

GoTTY 使用指南:如何将终端分享到 Web 端_第1张图片

在这个例子中,我们只是简单用了下 GoTTY,并未加入任何选项。GoTTY 其实支持很多选项,其中不乏一些实用的功能,我将选取一些进行介绍。

Web 端赋权

大家实际操作时会发现,在不加任何选项的情况下,Web 端的功能非常有限,但是加入一些选项就可以赋予其额外的权力。

  • Web 端可写

通过 GoTTY 打开的网页默认只有只读权限,但在某些场景下,Web 端会要求可写。此时,加上 --permit-write-w 选项就可以允许其可写。

比如,编辑某个文件可以这样执行命令:

[root@localhost ~]# gotty -w vi test.txt

接下来就可以从 Web 端编辑文件了:

GoTTY 使用指南:如何将终端分享到 Web 端_第2张图片

  • Web 端传参

除了赋予 Web 端可写的权力,GoTTY 也支持加入 --permit-arguments 允许从 Web 端传参。

以常用的 top 命令为例,方法如下:

[root@localhost ~]# gotty --permit-arguments top

比如要调整显示的间隔时间,可以在 URL 的末尾加上 arg 传参:

# 设置 top 的间隔时间为 1 秒,等价于 top -d 1
/?arg=-d&arg=1

安全性

在之前的示例中,我们对 Web 端的访问可以说是毫无限制,这无疑存在安全隐患。GoTTY 中还有一些选项可以增加访问的安全性。

  • 身份验证

通过 --credential-c 选项可以开启身份验证。

[root@localhost ~]# gotty  -c admin:admin df

开启验证后,从 Web 端访问必须输入指定的用户名和密码。

GoTTY 使用指南:如何将终端分享到 Web 端_第3张图片

  • 随机 URL

GoTTY 还可以通过 --random-url-r 选项在 URL 末尾生产一串随机字符串。

[root@localhost ~]# gotty -r df
2021/06/22 15:03:41 Server is starting with command: df
2021/06/22 15:03:41 URL: http://127.0.0.1:8080/zs8nsuez/
2021/06/22 15:03:41 URL: http://[::1]:8080/zs8nsuez/
2021/06/22 15:03:41 URL: http://192.168.128.134:8080/zs8nsuez/
2021/06/22 15:03:41 URL: http://[fe80::7246:6047:4d9f:84b6]:8080/zs8nsuez/
2021/06/22 15:03:41 URL: http://192.168.122.1:8080/zs8nsuez/

通过与字符串的拼接,URL 会变得随机,这样可以降低 URL 泄露的风险。从浏览器访问的效果如下:

GoTTY 使用指南:如何将终端分享到 Web 端_第4张图片

  • 启用 TLS/SSL

目前,我们通过选项加入了身份验证和随机 URL,但另一个安全隐患是,当前所有的连接都是不安全的,即没有通过 HTTPS 协议来访问。

针对这个问题,可以使用 --tls-t 选项来开启 TLS/SSL,并通过 --tls-crt--tls-key 指定证书和密钥。

# 这里的证书为工具生成的自签证书。
[root@localhost ~]# gotty -t --tls-crt ./server.crt --tls-key ./server.key df

此时再用 HTTPS 来访问,可以看到,连接已经是安全的了:

GoTTY 使用指南:如何将终端分享到 Web 端_第5张图片

配置文件

正如介绍所言,GoTTY 的选项很多,即使有短写格式,仍免不了书写繁琐的麻烦。此时,我们可以将通用的选项写到配置文件中。

GoTTY 默认的配置文件为 ~/.gotty,这个文件不会自动生成,需要手动创建。创建完成后,可以把之前的选项都加入到配置文件中:

[root@localhost ~]# vi ~/.gotty

# 监听端口
port = "8080"
# 允许可写
permit_write = true
# 允许传参
permit_arguments = true
# 开启身份验证
enable_basic_auth = true
# 设置用户名和密码
credential = "admin:admin"
# 开启随机 URL
enable_random_url = true
# 开启 TLS/SSL
enable_tls = true
# 指定证书
tls_crt_file = "~/server.crt"
# 指定密钥
tls_key_file = "~/server.key"

通过配置文件,我们还可以自定义 Web 端的标题、字体大小以及其它选项值等,完整的配置文件可以参考这里[2]

写在最后

有一说一,由 GoTTY 打开的网页操作起来并不方便,远不如 XShell 之类的工具来得好用。但在某些场景,比如开头描述的情况下,使用 GoTTY 是恰到好处的。

References

[1] GoTTY: https://github.com/yudai/gotty
[2] 这里: https://github.com/yudai/gotty/blob/master/.gotty

你可能感兴趣的:(GoTTY,WebTTY)