如果你有很多的服务器要连接,如果对你来说记住那些服务器的地址、端口实在是一种痛苦,如果你一直在寻找一种能够简化在命令行下连接 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 文件里,就变成了这个样子:
# 此处我为了美观起见,给每个子条目都缩进了一层,实际使用时缩进不影响文件的效果。 |
嗯,在这里,它还有了一个新名字,叫 sample
。
然后,我们只需要:
ssh sample |
就可以连接到这台主机了。
创建通配符规则
有的时候,我们需要连接多台不同的主机,那难道我们需要针对每个主机都写一遍规则吗?
答案是不一定。如果你要连接的主机,它们的域名有一定规律可循,那么我们可以用通配符来匹配这一系列的主机。
比如,公司里针对开发和测试环境,各创建了一系列集群,同时各个集群中又根据负责的业务不同,有多台负载均衡的主机,那么我们可以这样写:
# 首先匹配所有主机,在这里配置好我们的用户名、私钥等参数 |
接下来,我们只需要执行类似 ssh dev-user
,就可以连接到开发环境的负责用户管理的服务器上了。
而实现这个操作的重点,我想你已经注意到了,一个是 Host
配置中的 *
,另一个就是配置文件里面的 %h
。星号我们都知道,是个通配符,放在这里就意味着它会匹配所有以 dev-*
开头的主机名;而 %h
是一个占位符,它会把你在 SSH
命令中 destination
部分的输入取出来放在这里,所以当我们执行 ssh dev-user
的时候,实际上命令会被展开成 ssh dev-user.dev.mycompany.com
。
配置通过跳板机连接
如果公司规定所有服务器都需要先 SSH
到跳板机,然后才能连接到具体的服务器,那该怎么办?把 ssh_config
文件放在跳板机上吗?
确实这是一个解决方案,但不是唯一解。因为我们还有一个配置参数叫 ProxyJump
。它,就是用来指定,在连接这个服务器之前,需要通过哪个跳板机。
写起来,是这样的:
# 其他部分略 |
如果你的 SSH
版本早于 7.3,那么很可惜它是不支持 ProxyJump
这条配置的。但是不要灰心,它支持另一条配置,ProxyCommand
。
# 其他部分略 |
然后,我们继续执行 ssh dev-user
就可以了,SSH
会自动先连接到跳板机,然后在跳板机中再连接到我们要去的服务器。
如果你们公司安全做的非常好,需要通过数个跳板机来连接服务器,那么只需要给每个跳板机都配置上更外层的跳板就好了,像这样:
# 其他部分略 |
这样,SSH
就会先连接到 bastion-outer
,然后连到 bastion-inner
,然后连到 dev-user
。理论上,你可以在这里无限套娃(逃
这玩意有意思,我还想了解更多!
好吧,为了满足你的好奇心,我这里为你提供了 3 篇博客供你参考。当然,这三篇博客也是我编写本文时的参考文档:
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