• 终端共享神器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进行连接。

  • 相关阅读:
    redis事务详解
    redis之管道
    redis持久化
    redis之通信协议
    redis之线程IO模型
    Google、Azure、阿里云、RedHat…全球的 K8s 圈大佬聚在一起要聊啥?
    开箱即用,Knative 给您极致的容器 Serverless 体验
    2020 年 HackerEarth 调查:Go 语言成为最受欢迎的语言(内含 Go 语言图谱下载)
    Serverless 选型:深度解读 Serverless 架构及平台选择
    阿里云容器服务发布 Knative 托管服务 | 云原生生态周报 Vol. 49
  • 原文地址:https://www.cnblogs.com/kcxg/p/14234111.html
Copyright © 2020-2023  润新知