SSH 配置文件简单指南

3,427 阅读4分钟

这里原文 Using the SSH Config File 的翻译。网上搜索 ssh 配置看到这篇文章,写的比较简单易懂。

前言

如果我们有许多服务器需要连接,并且这些机器存在不同的用户名、端口或者其他的选项,如果在去连接的时候记住这些内容是很麻烦和影响效率的事情。当然我们也可以采用 alias 来简化某些场景下的使用。 本文主要是介绍在 ssh 配置文件中对不同服务器单独设置一些参数(比如端口、用户名)。

SSH Config 文件地址

OpenSSH 的客户端配置文件名称为 config,位于用户家目录下的 .ssh 目录。 ~/.ssh 是在运行第一次 ssh 命令的时候自动创建的。如果不存在的话,可以手动创建一下:

mkdir -p ~/.ssh && chmod 700 ~/.ssh

默认情况下,config 配置可能不存在,所以同样可以自己手动创建一下:

touch ~/.ssh/config

该文件必须要是被用户可读可写的,但是不能被其他用户访问:

chmod 600 ~/.ssh/config

SSH Config 文件结构

Host hostname1
    SSH_OPTION value
    SSH_OPTION value

Host hostname2
    SSH_OPTION value

Host *
    SSH_OPTION value

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/24 subnet 但是 10.10.0.5 除外.

SSH 客户端是从上往下匹配的,因此如果有多个 Host 匹配命中,其中定义的配置参数第一个出现的生效,比如第一个匹配配置组里面有 User 配置,最后匹配到的配置组里面也有,那是第一个匹配到的 User 会被实际使用。所以建议将比较具体的匹配放在上方,通用的放在后面(比如针对某一个 ip 段的放在上面,针对所有的放在最后面)。

可以通过 man ssh_config 或者访问 ssh_config man page 查看有哪些 ssh 的配置项。 ssh 配置通用会被其他应用使用,比如 scp/sftp/rsync。

SSH 配置示例

如果在 config 里面没有任何特殊配置,我们一般会采用如下这个命令来连接我们的主机:

ssh john@dev.example.com -p 2322

那怎么简化我们的连接过程呢,可以在 config 文件里面写下如下配置:

Host dev
    HostName dev.example.com
    User john
    Port 2322

这样我们就可以通过输入 ssh dev 连接我们的主机了。

ssh dev

SSH 配置组合

下面介绍一个关于 Host 匹配和配置优先级更加详细的示例。

Host targaryen
    HostName 192.168.1.10
    User daenerys
    Port 7654
    IdentityFile ~/.ssh/targaryen.key

Host tyrell
    HostName 192.168.10.20

Host martell
    HostName 192.168.10.50

Host *ell
    user oberyn

Host * !martell
    LogLevel INFO

Host *
    User root
    Compression yes
  • 当我们使用 ssh targaryen 进行连接时。ssh 客户端从文件读取配置,使用第一个配置组的配置 Host targaryen。然后继续向下匹配。下一个匹配的配置组是 Host * !martell (所有的 hosts 但是 martell 除外),因此该配置组内的配置项通用会被使用。最后一个配置组 Host * 通用被匹配上,但是这里面只有 Compression 配置参数会被使用上。因为 User 这个参数在第一个配置组 Host targaryen 里面已经定义了(注意优先级)。 那对于我们使用 ssh targaryen 进行连接时实际使用到的配置如下:
HostName 192.168.1.10
User daenerys
Port 7654
IdentityFile ~/.ssh/targaryen.key
LogLevel INFO
Compression yes
  • 当使用 ssh tyrell 连接时,匹配到的配置组有:Host tyrell/Host *ell/Host * !martellHost *。实际进行连接的配置如下:
HostName 192.168.10.20
User oberyn
LogLevel INFO
Compression yes
  • 当使用 ssh martell, 匹配到的是: Host martell, Host *ellHost *。 实际进行连接的配置如下::
HostName 192.168.10.50
User oberyn
Compression yes
  • 对于其他所有的连接,ssh 客户端会使用到 Host * !martellHost * 配置组里面定义的配置。

覆盖 SSH 配置文件

ssh 客户端读取配置采用一下顺序:

  1. 命令行定义的配置
  2. 定义在 ~/.ssh/config 里的配置
  3. 定义在 /etc/ssh/ssh_config 的配置

如果想单独覆盖某一个配置项,可以在命令行里指定。比如在配置文件里面有如下配置:

Host dev
    HostName dev.example.com
    User john
    Port 2322

但是我们想在连接的时候使用 root 用户,那我们就可以加上 -o 进行指定:

ssh -o "User=root" dev

另外也可以使用 -F (configfile) 来单独指定一个配置文件。 如果在连接时想忽略任何配置文件里面定义的配置可以使用如下命令:

ssh -F /dev/null user@example.com

总结

本文展示了 ssh 配置文件相关的一些简单使用场景。

参考资料

Using the SSH Config File