巧用反弹 shell 将两个异地的 TTY 同步

我们常常会遇到需要远程帮别人协助修复服务器等场景,这种时候经常会有一些信息需要对方输入,比如敏感的 API Key 或者密码等。
如果只是简单地连接对方的 SSH 服务器,则很不方便让对方进行操作,需要要求对方通过聊天工具发送这些敏感信息,这既不安全也不方便。
而且,这种方式对方也看不到我们在干什么,添加公钥的操作也比较敏感。
最好的方法,就是能够建立一个虚拟终端,对双方同步,双方都可以对这个终端进行操作。这样所有的操作对双方都非常透明。尤其是当我们在进行终端操作的教学时,优点尤其突出,因为对方可以看到整个操作过程。

思路

我们可以巧妙运用反弹 shell 的方法,再通过 screen 命令 spawn 出一个完整的 pty。然后让位于异地的两个 TTY 都作为这个 pty 的输入输出端,这样两个 TTY 就同步了。

假设

我们假设被控机上已经安装了 socat、screen,主控机上已经安装了 socat。
假设被控机能直连主控机。
主控机设为 A: 10.0.0.1 端口 4444
需要内网穿透等情况自行修改地址。

命令

在主控机上执行:

socat file:`tty`,raw,echo=0 tcp-listen:4444

在被控机上执行:

socat exec:'screen -A bash -li',pty,stderr,setsid,sigint,sane tcp:10.0.0.1:4444
screen -x

这样,两个终端就同步了。
有一些问题,就是主控端退出同步终端之后,主控端当前的 tty 行为会不正常。