終端共享神器tmate簡明教程


在Unix/Linux上工作,最常用的就是Terminal。那么,如何將你的Terminal共享給別人一起協同工作(你幫助別人解決問題或者請別人幫助你解決問題)呢?很簡單,使用終端共享神器tmate

01 - 剛性需求

絕大多數人都不是萬能的,總有需要他人現場指導或提供幫助的時候。那么,在無法面對面交談的時候(尤其是在新冠病毒肆虐的特殊時期),把你的終端(Terminal)共享出去,就可以實現即時且所見即所得的1:1協助。同樣地,基於Terminal的結對編程或code review也迫切需要終端共享。

02 - 基本流程

02.1 安裝tmate

sudo dnf install tmate # <<< Fedora sudo yum install tmate # <<< CentOS sudo apt install tmate # <<< Ubuntu

02.2 啟動tmate

假定A現在需要B的幫助,於是,A在他的終端(Terminal)上鍵入:

A$ tmate

然后就可以看到類似下圖的界面:

 

現在A通過即時通訊軟件(如IRC)將"ssh session:"后面的那串消息"ssh 3vRvL79HMtjmBetF37REVvU4z@sfo2.tmate.io"發送給B,然后等待B的連接。

注意:如果A沒有SSH key,需要事先創建一個,命令如下:

A$ ssh-keygen

02.3 通過ssh進行連接

B在其終端輸入:

B$ ssh 3vRvL79HMtjmBetF37REVvU4z@sfo2.tmate.io

然后B和A就共享了同一個Terminal。無論是A還是B都可以操作該Terminal。

02.4 關閉連接

A在他的終端(Terminal)上鍵入exit即可。

A$ exit

03 - 基本原理

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。

04 - 常見命令

04.1 顯示連接信息

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

04.2 分離/接入/查看

  • 指定socket文件啟動
$ tmate -S /tmp/foo.sock
  • 分離
$ tmate detach
  • 接入
$ tmate -S /tmp/foo.sock attach
  • 查看
$ tmate -S /tmp/foo.sock ls
0: 2 windows (created Sat Feb 29 20:40:02 2020) [144x35]
  • 關閉會話
$ tmate -S /tmp/foo.sock kill-session

05 - 更多連接方式

tmate支持4種連接方式,ssh、ssh-ro、web和web-ro。其中,ssh、web支持讀寫訪問,ssh-ro、web-ro支持只讀訪問。下面就是web只讀訪問方式的截圖。

注意:tmate啟動之后,過幾分鍾后再執行tmate show-messages就會失效,那么需要重新獲取連接信息的話,可以使用下面的腳本:

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

例如:

$ ./foo.sh /tmp/foo.sock sshrw
ssh JHELdz9a3EvTcL5w5beVMvwde@sfo2.tmate.io
$ ./foo.sh /tmp/foo.sock sshro
ssh ro-Nv7fk2YT3urVEAEFCSexx7XHw@sfo2.tmate.io
$ ./foo.sh /tmp/foo.sock webrw
https://tmate.io/t/JHELdz9a3EvTcL5w5beVMvwde
$ ./foo.sh /tmp/foo.sock webro
https://tmate.io/t/ro-Nv7fk2YT3urVEAEFCSexx7XHw

06 - 訪問控制

通常情況下,鑒於tmate生成的共享鏈接(ssh or web)在提供給他人訪問的時候無需任何安全驗證,而且此連接存儲在tmate.io的服務器上,所以在使用此功能的時候請保持謹慎

  • 第一,只把共享鏈接發送給你所信任的人知曉;
  • 第二,如無必要,請僅僅發送只讀鏈接;
  • 第三,一旦共享結束,請及時關閉會話。

那么,如何實現訪問控制呢?

  • 將你所信任的人B的公鑰加入到你(A)的~/.ssh/authorized_keys文件中,
  • 啟動tmate使用如下命令:
A$ tmate -a ~/.ssh/authorized_keys

這樣,只有B才能通過ssh訪問你的共享鏈接。陌生人C的公鑰沒有保存到A的~/.ssh/authorized_keys文件中,於是會出現如下類似的拒絕訪問信息。

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

有關訪問控制的更多內容,請訪問https://tmate.io/的Access control一節。

特別提示:一旦使用了基於文件authorized_keys的訪問控制,就不能使用基於web的連接方式,也就是說,只能使用ssh進行連接。

 

參考資料:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM