SSH 配置文件简单指南
文章目录
前言
如果我们有许多服务器需要连接,并且这些机器存在不同的用户名、端口或者其他的选项,如果在去连接的时候记住这些内容是很麻烦和影响效率的事情。当然我们也可以采用 alias 来简化某些场景下的使用。 本文主要是介绍在 ssh 配置文件中对不同服务器单独设置一些参数(比如端口、用户名)。
SSH Config 文件地址
OpenSSH 的客户端配置文件名称为 config,位于用户家目录下的 .ssh 目录。
~/.ssh 是在运行第一次 ssh 命令的时候自动创建的。如果不存在的话,可以手动创建一下:
| |
默认情况下,config 配置可能不存在,所以同样可以自己手动创建一下:
| |
该文件必须要是被用户可读可写的,但是不能被其他用户访问:
| |
SSH Config 文件结构
| |
config 的结构如上所示,是一块一块的。每一块使用 Host 指令开始,下面是针对其的一些特殊的设置。
缩进其实不是必须的,但是有缩进非常有助于查看。
Host 后面可以是一个或者多个需要匹配的内容(多个使用空格分隔) 可以采用下面这些特殊标识符:
*匹配 0 或者任意个字符。比如Host *匹配所有的 Hosts,192.168.0.*匹配192.168.0.0/24这个 subnet 下的 IP.?匹配一个字符。如10.10.0.?匹配10.10.0.[0-9]!取反,即不匹配。比如Host 10.10.0.* !10.10.0.5匹配10.10.0.0/24subnet 但是10.10.0.5除外.
SSH 客户端是从上往下匹配的,因此如果有多个 Host 匹配命中,其中定义的配置参数第一个出现的生效,比如第一个匹配配置组里面有 User 配置,最后匹配到的配置组里面也有,那是第一个匹配到的 User 会被实际使用。所以建议将比较具体的匹配放在上方,通用的放在后面(比如针对某一个 ip 段的放在上面,针对所有的放在最后面)。
可以通过 man ssh_config 或者访问 ssh_config man page 查看有哪些 ssh 的配置项。
ssh 配置通用会被其他应用使用,比如 scp/sftp/rsync。
SSH 配置示例
如果在 config 里面没有任何特殊配置,我们一般会采用如下这个命令来连接我们的主机:
| |
那怎么简化我们的连接过程呢,可以在 config 文件里面写下如下配置:
| |
这样我们就可以通过输入 ssh dev 连接我们的主机了。
| |
SSH 配置组合
下面介绍一个关于 Host 匹配和配置优先级更加详细的示例。
| |
- 当我们使用
ssh targaryen进行连接时。ssh 客户端从文件读取配置,使用第一个配置组的配置Host targaryen。然后继续向下匹配。下一个匹配的配置组是Host * !martell(所有的 hosts 但是 martell 除外),因此该配置组内的配置项通用会被使用。最后一个配置组Host *通用被匹配上,但是这里面只有Compression配置参数会被使用上。因为User这个参数在第一个配置组Host targaryen里面已经定义了(注意优先级)。 那对于我们使用 ssh targaryen 进行连接时实际使用到的配置如下:
| |
- 当使用
ssh tyrell连接时,匹配到的配置组有:Host tyrell/Host *ell/Host * !martell和Host *。实际进行连接的配置如下:
| |
- 当使用
ssh martell, 匹配到的是:Host martell,Host *ell和Host *。 实际进行连接的配置如下::
| |
- 对于其他所有的连接,ssh 客户端会使用到
Host * !martell和Host *配置组里面定义的配置。
覆盖 SSH 配置文件
ssh 客户端读取配置采用一下顺序:
- 命令行定义的配置
- 定义在
~/.ssh/config里的配置 - 定义在
/etc/ssh/ssh_config的配置
如果想单独覆盖某一个配置项,可以在命令行里指定。比如在配置文件里面有如下配置:
| |
但是我们想在连接的时候使用 root 用户,那我们就可以加上 -o 进行指定:
| |
另外也可以使用 -F (configfile) 来单独指定一个配置文件。
如果在连接时想忽略任何配置文件里面定义的配置可以使用如下命令:
| |
总结
本文展示了 ssh 配置文件相关的一些简单使用场景。
参考资料
文章作者 Chen Guixian
上次更新 2021-09-15