文章首发于个人公号:「阿拉平平」
最近正值项目上线,项目采用微服务架构并通过 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,并未加入任何选项。GoTTY 其实支持很多选项,其中不乏一些实用的功能,我将选取一些进行介绍。
Web 端赋权
大家实际操作时会发现,在不加任何选项的情况下,Web 端的功能非常有限,但是加入一些选项就可以赋予其额外的权力。
- Web 端可写
通过 GoTTY 打开的网页默认只有只读权限,但在某些场景下,Web 端会要求可写。此时,加上 --permit-write
或 -w
选项就可以允许其可写。
比如,编辑某个文件可以这样执行命令:
[root@localhost ~]# gotty -w vi test.txt
接下来就可以从 Web 端编辑文件了:
- 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 端访问必须输入指定的用户名和密码。
- 随机 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 泄露的风险。从浏览器访问的效果如下:
- 启用 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 的选项很多,即使有短写格式,仍免不了书写繁琐的麻烦。此时,我们可以将通用的选项写到配置文件中。
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