背景

最近开了一个新的音视频实时通信的项目,因为是开发初期,所以要频繁的在服务器上进行debug,日志分析,服务更新/发布。之前一直都是直接ssh登录的,但是现在这台服务器使用了google两边认证+跳板机的登录策略,目标机器是不直接开放的,所以每次登录都需要密码+手机认证码+跳板机跳转,很麻烦也无法自动化。

两步认证到跳板机(由于两步认证的存在,没法使用sshpass)
跳板机登录到目标服务器

而且一旦ssh中断就得重来一次认证,有时候需要开两三个的ssh连接,所以每次网络切换/工作机休眠/重启就要认证三次,极其蛋疼。

解决办法

作为一名程序员,自然难以难忍受手动重复的工作。最开始我尝试寻找简化登录流程的办法,尝试了sshpass各种参数,暂时没有收获。所以需要换一种思路,既然登录服务器的过程没法自动化,那么我们就把目标转向重用ssh连接,登录一次之后一直保持会话,岂不美哉。

mosh

首先要用到的工具是mosh,用来取代直接ssh登录。

(mobile shell)

Mosh is a replacement for interactive SSH terminals. It’s more robust and responsive, especially over Wi-Fi, cellular, and long-distance links.

https://mosh.org/

mosh(mobile shell)是用来取代ssh终端的工具,由于建立在udp协议上,所以相比基于tcp的ssh有很多优点:

  • 切换网络之后不会丢失连接,会话窗口不会中断
  • 会话在中断过后,不会立刻退出,而是启用一个计时器,当网络恢复后会自动重新连接,同时会延续之前的会话,不会重新开启一个。
  • 键入字符立即回显,在高延迟环境下相比ssh流畅很多

由于上述特性,只要我们不主动关闭连接,电脑休眠,切换网络,关机重启都不会导致连接丢失,下次打开电脑时只要网络可用连接就会恢复,不会导致命令中断,当前环境丢失。

mosh的安装也很简单,在ubuntu上直接apt install mosh即可。mosh服务端默认使用udp 60000-61000端口,每个mosh客户端使用一个端口。

在服务端和客户端都安装mosh之后,客户端使用mosh直接连接目标机器即可,对于ssh是无缝替换的。例如服务器是192.168.0.1,我们使用mosh username@192.168.0.1,输入密码(或者密钥登录)即可开启一个远程会话。mosh连接的本质是ssh 登录成功之后,自动开启一个mosh-server进程监听udp端口,然后客户端使用mosh-client进行连接。

跳板机

在本文所处的环境中,由于目标服务器是无法直连的,所以我们需要通过跳板机进行登录,假设目标服务器是10.0.0.9,跳板机是192.168.0.1,那么登录命令是

mosh user2@10.0.0.9 --experimental-remote-ip=local --ssh='ssh -J user1@192.168.0.1'

上面的命令有点长,我们可以在本地机器bashrc中设置命令别名

alias moshlg="mosh user2@10.0.0.9 --experimental-remote-ip=local --ssh='ssh -J user1@192.168.0.1'"

好了,这样每次开启会话的时候只要输入moshlg,然后依次输入跳板机登录密码,两步认证密码,即可开启一个mosh会话,这样在网络中断或者电脑休眠的时候都可以恢复连接。只要我们不去主动关闭这个会话,就可以一直使用,不管是断网,断电,还是上下班。

但是Mosh还有一个很蛋疼的地方,就是输出滚动,这在一个命令输出超过一屏,或者看一些比较大的日志文件或者源码的时候,滚动屏幕并不会显示服务器的输出,而是你本地的输出。

mosh 滚动屏幕的输出(服务器shell超出一屏的内容被截断了)

tmux

为了解决上述mosh滚动的问题,可以使用tmux复用终端会话来解决,使用mosh登录之后开启一个tmux的会话,这样就可以使用tmux来进行输出滚动了,还可以在终端中实现查找,复制等命令,很方便。

还是以上述的跳板机登录为例,登录命令:

alias moshlg="mosh user2@10.0.0.9 --experimental-remote-ip=local --ssh='ssh -J user1@192.168.0.1 --tmux'"

使用moshlg登录之后,就是一个tmux会话,如果需要滚动屏幕输出,使用ctrl+b,[,就可以进入滚动模式,快捷键与vim相同,hjkl,ctrl+b, ctrl+f。其实tmux作为终端会话复用工具,还有很多有用的功能,可以参考文档去了解。

总结

设置好上述命令之后,我一般是使用moshlg开启三个终端会话,然后就可以一直愉快的使用了,只要电脑不关机重启,本地进程不退出,就再也不用重建连接,远程环境一直存在,输出内容也不会丢失。电脑休眠,过了五一的五天假期回来,唤醒之后连接自动恢复,直接开始工作,很好很强大。

发表评论

电子邮件地址不会被公开。 必填项已用*标注