关于简化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 系统下的操作流程便可以这样:
- 打开终端,输入
ssh uname@host_or_ip
回车,再输入密码登录远程主机; - 使用
command + t
快捷键打开新窗口,输入ssh uname@host_or_ip
回车之后,便会发现无需输入密码,便已经登录了该远程主机。 - 这个时候,即便将所有已经登录远程主机的窗口关闭,甚至把终端也退出、网络断开后重连,然后再重新打开终端,输入
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 # 示例端口号