gotty 在浏览器中共享 linux 终端

来看下官方的说明:

GoTTY - Share your terminal as a web application

GoTTY is a simple command line tool that turns your CLI tools into web applications.

screenshot

GoTTY 是一个简单的基于 Go 语言的命令行工具,它可以将终端(TTY)作为 web 程序共享。它会将命令行工具转换为 web 程序。

它使用 Chrome OS 的终端仿真器(hterm)来在 Web 浏览器上执行基于 JavaScript 的终端。hterm + web socket 想法灵感来自 Wetty 项目

一、安装

可以使用go自行编译,也可以直接使用官方编译好的二进制包:https://github.com/yudai/gotty/releases

我使用了1.0.1这个版本:

export VER="1.0.1"

wget https://github.com/yudai/gotty/releases/download/v${VER}/gotty_linux_amd64.tar.gz

tar xvf gotty_linux_amd64.tar.gz
chmod +x gotty
mv gotty /usr/local/bin/

echo "https://github.com/yudai/gotty"
/usr/local/bin/gotty -verson

image-20210713104710247

二、使用

参考官方github使用 https://github.com/yudai/gotty#usage

既可以使用配置文件,也可以直接在命令行中带上。

2.1 简单使用

Usage: gotty [options] <command> [<arguments...>]

例如:

gotty top
gotty df -h

直接在后边带上命令即可。

gotty也提供了较多的自定义能力,比如:

  • 指定监听的ip和端口
  • 开启SSL
  • 启用账号密码登陆
  • 启用浏览器可操作命令行

具体还是参考官方文档。

2.2 个人命令参考

下面是我的运行命令,指定了监听的ip和端口,并让其进入 tmux 的会话,达到命令行共享的能力:

/usr/local/bin/gotty -a $KELU_LOCAL_IP -p 38480 tmux attach -t gotty

使用 linux 默认的 screen 命令也可以达到这样的效果。

2.3 nginx配置

nginx 转发配置示例,主要是注意把 websocket 转发的参数配上:

server {
  listen       80;
  server_name  xxx.xxx.xxx;

  access_log /log/nginx.access.log;
  error_log /log/nginx.error.log;

  location / {
     proxy_pass http://xxx.xxx.xxx.xxx:38480;
     proxy_redirect off;
     proxy_set_header Host $host;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header Upgrade $http_upgrade;
     proxy_set_header Connection "upgrade";
     proxy_set_header Accept-Encoding gzip;
  }
}

2.4 systemd配置

光有命令其实不足以日常维护,我把gotty注册成为一个systemd服务,由系统进行管理。配置参考:

[Unit]
Description=GoTTY
Documentation=https://github.com/yudai/gotty
After=network.target

[Service]
User=root
Group=root
Environment=TERM=xterm-256color
ExecStart=/usr/local/bin/gotty -a x.x.x.x -p 38480  tmux attach -t gotty
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

需要关注点的主要是显式声明终端信息:

Environment=TERM=xterm-256color

运行命令即可:

cp gotty.service /etc/systemd/system
systemctl enable gotty
systemctl start gotty
systemctl status gotty

image-20210713110221933

参考资料


使用 slides 在 linux 终端演示 PPT linux tc 流量控制备忘