使用 GoTTY 实现通过 Web 访问终端
一、安装GoTTY
使用go get
安装
此方法需要 golang
环境支持,go的版本需要>=1.9
。
go version
go version go1.16.3 linux/amd64
go get
命令会从最新的 master 分支编译出一个二进制文件放在 $GOPATH/bin
下,其中可能包括不稳定或重大的更改。
go get github.com/yudai/gotty
注:请检查 $GOPATH/bin
是否已经加入到 path
中。export PATH="$PATH:$GOPATH/bin"
使用二进制安装
下载地址:https://github.com/yudai/gotty/releases/tag/v1.0.1
下载对应版本到本地,我这边下载的是 gotty_linux_amd64.tar.gz linux 64位的版本。
解压文件,并将文件移动到/usr/bin下
tar -zxvf gotty_linux_amd64.tar.gz
sudo mv ./gotty /usr/bin
检查是否安装成功
gotty -v
gotty version 1.0.1
二、使用GoTTY
GoTTY的常规语法
gotty [options] <command> [<arguments...>]
GoTTY命令的常用参数
--address value, -a value IP address to listen (default: "0.0.0.0") [$GOTTY_ADDRESS]
--port value, -p value Port number to liten (default: "8080") [$GOTTY_PORT]
--permit-write, -w Permit clients to write to the TTY (BE CAREFUL) [$GOTTY_PERMIT_WRITE]
--credential value, -c value Credential for Basic Authentication (ex: user:pass, default disabled) [$GOTTY_CREDENTIAL]
--random-url, -r Add a random string to the URL [$GOTTY_RANDOM_URL]
--random-url-length value Random URL length (default: 8) [$GOTTY_RANDOM_URL_LENGTH]
--tls, -t Enable TLS/SSL [$GOTTY_TLS]
--tls-crt value TLS/SSL certificate file path (default: "~/.gotty.crt") [$GOTTY_TLS_CRT]
--tls-key value TLS/SSL key file path (default: "~/.gotty.key") [$GOTTY_TLS_KEY]
--tls-ca-crt value TLS/SSL CA certificate file for client certifications (default: "~/.gotty.ca.crt") [$GOTTY_TLS_CA_CRT]
--index value Custom index.html file [$GOTTY_INDEX]
--title-format value Title format of browser window (default: "{{ .command }}@{{ .hostname }}") [$GOTTY_TITLE_FORMAT]
--reconnect Enable reconnection [$GOTTY_RECONNECT]
--reconnect-time value Time to reconnect (default: 10) [$GOTTY_RECONNECT_TIME]
--max-connection value Maximum connection to gotty (default: 0) [$GOTTY_MAX_CONNECTION]
--once Accept only one client and exit on disconnection [$GOTTY_ONCE]
--timeout value Timeout seconds for waiting a client(0 to disable) (default: 0) [$GOTTY_TIMEOUT]
--permit-arguments Permit clients to send command line arguments in URL (e.g. http://example.com:8080/?arg=AAA&arg=BBB) [$GOTTY_PERMIT_ARGUMENTS]
--width value Static width of the screen, 0(default) means dynamically resize (default: 0) [$GOTTY_WIDTH]
--height value Static height of the screen, 0(default) means dynamically resize (default: 0) [$GOTTY_HEIGHT]
--ws-origin value A regular expression that matches origin URLs to be accepted by WebSocket. No cross origin requests are acceptable by default [$GOTTY_WS_ORIGIN]
--term value Terminal name to use on the browser, one of xterm or hterm. (default: "xterm") [$GOTTY_TERM]
--close-signal value Signal sent to the command process when gotty close it (default: SIGHUP) (default: 1) [$GOTTY_CLOSE_SIGNAL]
--close-timeout value Time in seconds to force kill process after client is disconnected (default: -1) (default: -1) [$GOTTY_CLOSE_TIMEOUT]
--config value Config file path (default: "~/.gotty") [$GOTTY_CONFIG]
--version, -v print the version
使用详解
基本用法
gotty top
此命令将 top
命令绑定到默认端口 8080,使用浏览器访问 http://127.0.0.1:8080/ 即可看到 top
命令的输出内容
默认情况下,GoTTY 不允许客户端发送任何按键或命令,如果需要输入内容,可添加 -w
参数(后跟bash表示进入bash终端)
gotty -w bash
指定端口访问
添加 -port
参数,用于指定端口访问。
gotty -port 8899 -w bash
开启身份验证
使用 -c
参数限制客户端的访问,用户需要输入用户名和密码来登入终端。用户名和密码以 :
分割(用户名:密码)
gotty -port 8899 -w -c "root:7777" bash
自定义配置
你可以在 ~/.gotty
配置文件中修改默认选项,如果该文件存在,GoTTY会在每次启动时加载这个文件。
vim ~/.gootty
// 默认的监听端口
port = "9000"
// 默认是否开启tls
enable_tls = true
// 设置控制台显示的字体大小和背景颜色
preferences {
font_size = 10
background_color = "rgb(16, 16, 32)"
}
开启 TLS/SSL
选项
默认情况下 GoTTY 不加密服务器与客户端之间的所有流量,可通过添加 -t
参数在会话上开启TLS / SSL的选项。默认会加载 ~/.gotty.crt
和 ~/.gootty.key
密钥文件,可以使用 --tls-crt
和 --tls-key
选项覆盖这些文件路径。
可使用以下命令生成签名文件:
openssl req -x509 -nodes -days 9999 -newkey rsa:2048 -keyout ~/.gotty.key -out ~/.gotty.crt
为了提高安全性,可以通过 --tls-ca-crt
选项提供CA证书文件来使用 SSL / TLS 客户端证书认证(此选项需要设置 -t
或 --tls
)。
此选项要求所有客户端发送由指定证书颁发机构签名的有效客户端证书。
随机 URL
除了身份验证外,限制访问服务器的另一种方法是使用随机 URL。通过添加 -r
参数,GoTTY会生成一个随机URL,以便只有知道该URL的人才能访问该服务器。
❯ gotty -w -r -c root:777 bash
2021/04/12 16:47:56 Loading config file at: /home/sunls/.gotty
2021/04/12 16:47:56 Permitting clients to write input to the PTY.
2021/04/12 16:47:56 Using Basic Authentication
2021/04/12 16:47:56 Server is starting with command: bash
2021/04/12 16:47:56 URL: http://127.0.0.1:8080/63lzf3xi/
2021/04/12 16:47:56 URL: http://[::1]:8080/63lzf3xi/
2021/04/12 16:47:56 URL: http://10.45.90.86:8080/63lzf3xi/
2021/04/12 16:47:56 URL: http://[fe80::e09d:ae92:2a99:a974]:8080/63lzf3xi/
此处生成了一个随机 URL 63lzf3xi
,通过 http://127.0.0.1:8080/63lzf3xi/
才可访问到终端。
多个客户端共享
当新的客户端连接到服务器时,GoTTY将使用给定的命令启动新进程。这意味着默认情况下,用户无法与其他人共享一个终端。但是,可以使用终端多路复用器与多个客户端共享一个进程。
例如,可以通过下面的命令启动一个新的 gotty
以 top
命令命名的 tmux 会话。
❯ gotty tmux new -A -s gotty top
该命令不允许客户端发送击键,但是,可以从本地终端附加会话并运行诸如切换 top
命令模式之类的操作。要从终端连接到 tmux 会话,可以使用以下命令。
❯ tmux new -A -s gotty
三、Tmux 的简单使用
安装
# Arch Linux
$ sudo pacman -S tmux
# Ubuntu 或 Debian
$ sudo apt-get install tmux
# CentOS 或 Fedora
$ sudo yum install tmux
# Mac
$ brew install tmux
基本用法
新建一个无名称的会话
$ tmux
上面的命令会启动 一个Tmux 窗口,按下 Ctrl+d
或者输入 exit
命令,就可以退出 Tmux 窗口。
$ exit
会话管理
新建会话
第一个启动的 Tmux 窗口,编号是 0
,第二个窗口编号是 1
,以此类推。
更好的方法是为会话起名:
$ tmux new -s <session-name>
分离会话
在 Tmux 窗口下,按下 Ctrl+b d
或者输入 tmux detach
命令,就会将当前会话与窗口分离。
$ tmux detach
tmux ls
命令可以查看当前所有的 Tmux 会话。
$ tmux ls
接入会话
tmux attach
命令用于重新接入某个已存在的会话。
# 使用会话编号
$ tmux attach -t 0
# 使用会话名称
$ tmux attach -t <session-name>
杀死会话
tmux kill-session
命令用于杀死某个会话。
# 使用会话编号
$ tmux kill-session -t 0
# 使用会话名称
$ tmux kill-session -t <session-name>
切换会话
tmux switch
命令用于切换会话。
# 使用会话编号
$ tmux switch -t 0
# 使用会话名称
$ tmux switch -t <session-name>
重命名会话
tmux rename-session
命令用于重命名会话。
$ tmux rename-session -t 0 <new-name>
会话快捷键
下面是一些会话相关的快捷键。
Ctrl+b d:分离当前会话。
Ctrl+b s:列出所有会话。
Ctrl+b $:重命名当前会话。
四、GoTTY 搭配 Tmux 实现多会话共享
共享终端
将 GoTTY 指定为 tmux new
命令,当 web 访问时 GoTTY 时会新建一个名称为 gotty
的 tmux 窗口,-A
如果窗口已存在则会直接进入;-s
如果不存在则创建一个新的 tmux 窗口。
$ gotty -w tmux new -A -s gotty
实现效果:
指定 Tmux 的默认命令
Tmux 新建一个窗口默认是打开一个终端,我们可以在后面追加命令来指定打开 Tmux 窗口时所执行的命令。
$ gotty -w tmux new -A -s gotty mysql -uroot -p7410
添加 mysql -uroot -p7410
命令指定 Tmux 窗口为 MySQL 的控制台: