Pages

Thursday, 28 September 2023

使用 SSH config 简化 SSH连接

 

如果你有很多的服务器要连接,如果对你来说记住那些服务器的地址、端口实在是一种痛苦,如果你一直在寻找一种能够简化在命令行下连接 SSH 服务器的办法,那么,本文将给你提供一种解决问题的思路,那就是,使用 SSH 的 config 文件。

SSH config 文件是什么

Open SSH 客户端配置文件,允许你以配置项的形式,记录各个服务器的连接信息,并允许你使用一个定义好的别名来代替其对应的 ssh 命令参数。

SSH config 文件该怎么用

创建 SSH config 文件

通常来说,该文件会出现在两个地方,一个是 /etc/ssh/ssh_config,一个是 ~/.ssh/config

/etc/ssh/ssh_config 文件通常用来定义全局范围上的 SSH 客户端参数,而 ~/.ssh/config 则被用来定义每个用户自己的 SSH 客户端的配置。我们将要修改的,就是位于用户目录下的 config 文件。

如果 ~/.ssh/config 文件不存在,那么也不用着急,这是正常的,只需要执行如下命令,即可新建一个空白的 config 文件

touch ~/.ssh/config

编写 config 条目

假如说,我们想连接到一台服务器,它的地址是 example.server.com,端口号是 2222,以用户 admin 登陆,并使用~/.ssh/id_rsa 这个私钥验证身份。那么,我们需要在命令行里输入:

ssh admin@example.server.com -p 2222 -i ~/.ssh/id_rsa

嗯好吧,-i 参数可以省略,但即使这样,命令还是很长,对吧?

那么我们把这个服务器的连接参数写到 config 文件里,就变成了这个样子:

# 此处我为了美观起见,给每个子条目都缩进了一层,实际使用时缩进不影响文件的效果。

Host sample
Hostname example.server.com
Port 2222
User admin
Identityfile ~/.ssh/id_rsa

嗯,在这里,它还有了一个新名字,叫 sample

然后,我们只需要:

ssh sample

就可以连接到这台主机了。

创建通配符规则

有的时候,我们需要连接多台不同的主机,那难道我们需要针对每个主机都写一遍规则吗?

答案是不一定。如果你要连接的主机,它们的域名有一定规律可循,那么我们可以用通配符来匹配这一系列的主机。

比如,公司里针对开发和测试环境,各创建了一系列集群,同时各个集群中又根据负责的业务不同,有多台负载均衡的主机,那么我们可以这样写:

# 首先匹配所有主机,在这里配置好我们的用户名、私钥等参数
Host *
User boris1993
IdentityFile ~/.ssh/id_rsa

# 开发环境
Host dev-*
HostName %h.dev.mycompany.com

# 测试环境
Host staging-*
HostName %h.staging.mycompany.com

接下来,我们只需要执行类似 ssh dev-user,就可以连接到开发环境的负责用户管理的服务器上了。

而实现这个操作的重点,我想你已经注意到了,一个是 Host 配置中的 *,另一个就是配置文件里面的 %h。星号我们都知道,是个通配符,放在这里就意味着它会匹配所有以 dev-* 开头的主机名;而 %h 是一个占位符,它会把你在 SSH 命令中 destination 部分的输入取出来放在这里,所以当我们执行 ssh dev-user 的时候,实际上命令会被展开成 ssh dev-user.dev.mycompany.com

配置通过跳板机连接

如果公司规定所有服务器都需要先 SSH 到跳板机,然后才能连接到具体的服务器,那该怎么办?把 ssh_config 文件放在跳板机上吗?

确实这是一个解决方案,但不是唯一解。因为我们还有一个配置参数叫 ProxyJump。它,就是用来指定,在连接这个服务器之前,需要通过哪个跳板机。

写起来,是这样的:

# 其他部分略

# 跳板机
Host bastion
HostName bastion.mycompany.com

# 服务器
Host dev-*
HostName %h.dev.mycompany.com
ProxyJump bastion

如果你的 SSH 版本早于 7.3,那么很可惜它是不支持 ProxyJump 这条配置的。但是不要灰心,它支持另一条配置,ProxyCommand

# 其他部分略

# 跳板机
Host bastion
HostName bastion.mycompany.com

# 服务器
Host dev-*
HostName %h.dev.mycompany.com
ProxyCommand ssh -W %h:%p bastion

然后,我们继续执行 ssh dev-user 就可以了,SSH 会自动先连接到跳板机,然后在跳板机中再连接到我们要去的服务器。

如果你们公司安全做的非常好,需要通过数个跳板机来连接服务器,那么只需要给每个跳板机都配置上更外层的跳板就好了,像这样:

# 其他部分略

# 最外层跳板机
Host bastion-outer
HostName bastion-outer.mycompany.com

# 下一层跳板机
Host bastion-inner
HostName bastion-inner.mycompany.com
ProxyJump bastion-outer

# 服务器
Host dev-*
HostName %h.dev.mycompany.com
ProxyJump bastion-inner

这样,SSH 就会先连接到 bastion-outer,然后连到 bastion-inner,然后连到 dev-user。理论上,你可以在这里无限套娃(逃

这玩意有意思,我还想了解更多!

好吧,为了满足你的好奇心,我这里为你提供了 3 篇博客供你参考。当然,这三篇博客也是我编写本文时的参考文档:

多个 SSH KEY 的管理

How To Configure Custom Connection Options for your SSH Client

Simplify Your Life With an SSH Config File

另外,您也可以阅读 ssh_config 的手册页,来获得最原始的信息,阅读该手册的命令是:

man ssh_config
------------------------------------------------------------

为Git设置SSH公钥及私钥

在使用 Git 进行代码管理时,如果我们不使用 SSH 公钥及密钥,那么我们就必须在每次执行 Git 命令后键入密码来验明正身,所以为 Git 配置 SSH 公钥及密钥是很有必要的。下文对 Windows 及 Linux 系统,自建 Git 及 Github 均适用。
配置公钥

首先通过 ssh-keygen -t rsa -b 4096 -C "name@example.com" 或者 XShell 的相应功能来生成一对密钥和公钥。随后我们得到了一个 id_rsa 和 id_rsa.pub (名称来源于你的定义,本文统一视作 id_rsa),其中 id_rsa 为私钥,id_rsa.pub 为公钥,我们需要把这个公钥的内容上传到服务器对应 Git 用户的 .ssh/authorized_keys 目录中,并在 SSH 的配置文件中允许通过公钥登陆。对于 Github 来说则是上传到 Github 中的公钥设置页面中。如果遇到提示未在远程服务器注册的问题,请执行 chmod 600 authorized_keys 。至此公钥配置完毕。
配置私钥

私钥则需要在客户端也就是我们自己的计算机上进行配置。无论你使用 Windows 还是 Linux,私钥都应该放置于用户账户目录下的 .ssh 中,对于 Windows 则是 C:\Users\用户名\.ssh ,对于 Linux 则是 /home/用户名/.ssh 中。

随后我们在 .ssh 目录下新建一个 config 文件,将以下内容写入该文件:

Host 远程服务器域名或IP
User 登陆用的Git用户名
PreferredAuthentications publickey
IdentityFile /c/Users/用户名/.ssh/id_rsa

这样一来就可以在客户端直接使用 Git 而无须输入密码了。
多个 Git 服务器的密钥配置

我们经常会同时使用多个不同的 Git 服务器,例如同时使用 Github 和 自建 Git 服务。虽然我们可以使用同一对私钥和公钥来连接所有 Git 服务器,但是这有较大的安全风险。因此我们需要为每台 Git 服务器生成不同的公钥及私钥,然后在每个 Git 服务器上按上文配置公钥,在客户端中通过向 config 文件添加多个 Host 来解决这一问题。实例如下:

Host 192.168.1.10
User git
PreferredAuthentications publickey
IdentityFile /c/Users/用户名/.ssh/id_rsa_a

Host 192.168.1.11
User git
PreferredAuthentications publickey
IdentityFile /c/Users/用户名/.ssh/id_rsa_b

Windows 下配置 Git 私钥的注意事项

    由于 Windows 的目录也就是文件夹名称是允许空格存在的,而 Windows 下的 Git 客户端都是按照 Linux 的无空格标准来执行的,所以你的私钥如果保存到了带空格的文件夹下,就无法正常使用私钥登陆。此时只要把私钥移动至路径无空格的目录下,然后修改 config 文件中的 IdentityFile 为新路径即可。
    IdentityFile 的值需要填写 Linux 下的路径格式,如 /c/Users/eason/.ssh
而不能是 windows 下的 C:\Users\eason\.ssh


 
 

 

No comments:

Post a Comment