关于简化ssh登录远程主机的问题

本文主要讨论如何使用 ssh 的连接复用等特性简化登录远程主机的问题,ssh 的免密登录方案不在本文论述范围内。

1. 问题

使用 ssh 登录远程开发机时,对于每打开的一个新连接,都需要输入一次用户名和密码(使用用户名+密码的方式登录),特别的,当登录开发机需要跳板机进行中转的时候,或密码是动态变化的时候,很是麻烦。

2. 连接复用

其实 ssh 有一个特性可以做到重用连接,根据该特性,只需要在第一次登录的时候创建新的连接,之后若需要在新窗口进行同样的登录操作,那么就可以重用第一次登录时已经建立的连接。具体操作为,修改 ~/.ssh/config 文件(没有则新建),添加以下配置:

Host *
    ControlMaster auto
    ControlPath ~/.ssh/%h-%p-%r
    ControlPersist yes

关于上面配置的说明如下:

  • Host 指定下面跟着的配置对哪个 host 生效;
  • ControlMaster 设置为 auto 时,ssh 将尝试使用主连接,但如果对应的主连接不存在,将创建新连接作为主连接;
  • ControlPath 设置存储复用的主连接的 unix 套接字文件:%h 代表远程主机名,%p 代表远程端口号,%r 代表远程用户名;
  • ControlPersist 表示在创建首个连接(即主连接)的会话退出后,该连接是否仍然在后台保留,继续供其他复用该连接的会话使用

配置完成之后,比如在 macOS 系统下的操作流程便可以这样:

  1. 打开终端,输入 ssh uname@host_or_ip 回车,再输入密码登录远程主机;
  2. 使用 command + t 快捷键打开新窗口,输入 ssh uname@host_or_ip 回车之后,便会发现无需输入密码,便已经登录了该远程主机。
  3. 这个时候,即便将所有已经登录远程主机的窗口关闭,甚至把终端也退出、网络断开后重连,然后再重新打开终端,输入 ssh uname@host_or_ip 回车之后,会发现也无需输入密码,便已经登录了该远程主机。因为在上面 ControlPath 设置的文件位置,你可以发现一个对应的 socket 文件。

3. One more thing...

ssh 还有一个特性是可以使用别名来登录远程主机,可以将 ssh uname@host_or_ip 简化成 ssh foobar。同样,这里需要修改 ~/.ssh/config 文件(没有则新建),配置很简单,如下所示,

Host foobar
    HostName 192.168.60.205 # 示例ip地址
    User zhangwu            # 示例用户名
    Port 8087               # 示例端口号

参考