终端共享神器Tmate简明教程,


在 Unix/Linux 上工作,最常用的就是 Terminal。那么,如何将你的 Terminal 共享给别人一起协同工作(你帮助别人解决问题或者请别人帮助你解决问题)呢?很简单,使用终端共享神器 tmate。

1. 刚性需求

绝大多数人都不是万能的,总有需要他人现场指导或提供帮助的时候。那么,在无法面对面交谈的时候(尤其是在新冠病毒肆虐的特殊时期),把你的终端 (Terminal) 共享出去,就可以实现即时且所见即所得的 1:1 协助。同样地,基于 Terminal 的结对编程或 Code Review 也迫切需要终端共享。

2. 基本流程

2.1 安装 tmate

  1. $ sudo dnf install tmate # <<< Fedora  
  2. $ sudo yum install tmate # <<< CentOS  
  3. $ sudo apt install tmate # <<< Ubuntu 

2.2 启动 tmate

假定 A 现在需要 B 的帮助,于是,A 在他的终端 (Terminal) 上键入:

  1. A$ tmate 

然后就可以看到类似下图的界面:

现在 A 通过即时通讯软件(如 IRC)将  "ssh session:" 后面的那串消息 "ssh 3vRvL79HMtjmBetF37REVvU4z@sfo2.tmate.io" 发送给B,然后等待 B 的连接。

注意:如果 A 没有 SSH key ,需要事先创建一个,命令如下:

  1. A$ ssh-keygen 

2.3 通过 ssh 进行连接

B 在其终端输入:

  1. B$ ssh 3vRvL79HMtjmBetF37REVvU4z@sfo2.tmate.io 

然后 B 和 A 就共享了同一个 Terminal。无论是 A 还是 B 都可以操作该 Terminal。

2.4 关闭连接

A 在他的终端 (Terminal) 上键入 exit 即可。

  1. A$ exit 

3. 基本原理

tmate 即 teammates,是 tmux 的一个分支,并且和 tmux 使用相同的配置信息 (i.e:tmate 可与 tmux 共享 ~/.tmux.conf )。**tmate 不仅是一个终端多路复用器,而且具有即时分享终端的能力。**它允许在单个屏幕中创建并操控多个终端,同时这些终端还能与其他人分享。总的来说,tmux 支持的窗口 (window) 和窗格 (pane) 功能,tmate 都支持。tmate 的基本工作原理如下:

  •  运行 tmate 时,会在后台创建一个连接到 tmate.io(由 tmate 开发者维护的后台服务器)的 ssh 连接;
  •  tmate.io 服务器的 ssh 密钥通过 DH 交换进行校验;
  •  客户端通过本地 ssh 密钥进行认证;
  •  连接创建后,本地 tmux 服务器会生成一个 150 位(不可猜测的随机字符)会话令牌;
  •  队友能通过用户提供的 SSH 会话 ID 连接到 tmate.io。

4. 常见命令

4.1 显示连接信息

  1. $ tmate show-messages  
  2. Sat Feb 29 20:32:31 2020 [tmate] Connecting to master.tmate.io...  
  3. Sat Feb 29 20:32:37 2020 [tmate] Note: clear your terminal before sharing readonly access  
  4. Sat Feb 29 20:32:37 2020 [tmate] web session read only: https://tmate.io/t/ro-59nhrEMMpr8fvYEfW3LbU69r9  
  5. Sat Feb 29 20:32:37 2020 [tmate] ssh session read only: ssh ro-59nhrEMMpr8fvYEfW3LbU69r9@nyc1.tmate.io  
  6. Sat Feb 29 20:32:37 2020 [tmate] web session: https://tmate.io/t/2VFPtcBNnhaNRGWmKgKZH3zfn  
  7. Sat Feb 29 20:32:37 2020 [tmate] ssh session: ssh 2VFPtcBNnhaNRGWmKgKZH3zfn@nyc1.tmate.io 

4.2 分离/接入/查看

  •  指定 socket 文件启动 
  1. $ tmate -S /tmp/foo.sock 
  •  分离 
  1. $ tmate detach 
  •  接入 
  1. $ tmate -S /tmp/foo.sock attach 
  •  查看 
  1. $ tmate -S /tmp/foo.sock ls  
  2. 0: 2 windows (created Sat Feb 29 20:40:02 2020) [144x35] 
  •  关闭会话 
  1. $ tmate -S /tmp/foo.sock kill-session 

5. 更多连接方式

tmate 支持 4 种连接方式,ssh、ssh-ro、web 和 web-ro。其中,ssh、web 支持读写访问,ssh-ro、web-ro 支持只读访问。下面就是 web 只读访问方式的截图。

注意: tmate 启动之后,过几分钟后再执行 tmate show-messages 就会失效,那么需要重新获取连接信息的话,可以使用下面的脚本:

  1.  1 #!/bin/bash  
  2.  2   
  3.  3 function usage  
  4.  4 {  
  5.  5         echo "Usage: $1 <sock> [sshrw|webrw|sshro|webro]" >&2  
  6.  6 }  
  7.  7   
  8.  8 tmate_sock=$1  
  9.  9 msg_type=${2:-"sshrw"}  
  10. 10 [[ -z $tmate_sock ]] && usage $0 && exit 1  
  11. 11   
  12. 12 case $msg_type in  
  13. 13         "sshrw") tmate -S $tmate_sock display -p '#{tmate_ssh}'    ;;  
  14. 14         "sshro") tmate -S $tmate_sock display -p '#{tmate_ssh_ro}' ;;  
  15. 15         "webrw") tmate -S $tmate_sock display -p '#{tmate_web}'    ;;  
  16. 16         "webro") tmate -S $tmate_sock display -p '#{tmate_web_ro}' ;;  
  17. 17         *) usage $0; exit 1; ;;  
  18. 18 esac  
  19. 19 exit $? 

例如:

  1. $ ./foo.sh /tmp/foo.sock sshrw  
  2. ssh JHELdz9a3EvTcL5w5beVMvwde@sfo2.tmate.io  
  3. $ ./foo.sh /tmp/foo.sock sshro 
  4. ssh ro-Nv7fk2YT3urVEAEFCSexx7XHw@sfo2.tmate.io  
  5. $ ./foo.sh /tmp/foo.sock webrw  
  6. https://tmate.io/t/JHELdz9a3EvTcL5w5beVMvwde  
  7. $ ./foo.sh /tmp/foo.sock webro  
  8. https://tmate.io/t/ro-Nv7fk2YT3urVEAEFCSexx7XHw 

新版本的 Tmate,可以用 tmate -F 随时显示相关连接信息。

6.访问控制

通常情况下,鉴于 tmate 生成的共享链接(ssh or web)在提供给他人访问的时候无需任何安全验证,而且此连接存储在 tmate.io 的服务器上,所以在使用此功能的时候请保持谨慎。

  •  第一,只把共享链接发送给你所信任的人知晓;
  •  第二,如无必要,请仅仅发送只读链接;
  •  第三,一旦共享结束,请及时关闭会话。

那么,如何实现访问控制呢?

  •  将你所信任的人 B 的公钥加入到你 (A) 的 ~/.ssh/authorized_keys 文件中,
  •  启动 tmate 使用如下命令:
  1. A$ tmate -a ~/.ssh/authorized_keys 

这样,只有B才能通过 ssh 访问你的共享链接。陌生人 C 的公钥没有保存到 A 的 ~/.ssh/authorized_keys 文件中,于是会出现如下类似的拒绝访问信息。

  1. C$ ssh ERayHQKUPZkhtVufjjFTvtfjC@sgp1.tmate.io  
  2. ERayHQKUPZkhtVufjjFTvtfjC@sgp1.tmate.io: Permission denied (publickey). 

有关访问控制的更多内容,请访问 https://tmate.io/ 的 Access control 一节。

特别提示: 一旦使用了基于文件  authorized_keys 的访问控制,就不能使用基于 web 的连接方式,也就是说,只能使用 ssh 进行连接。

7. 参考资料

相关内容