这里原文 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 * !martell
和Host *
。实际进行连接的配置如下:
HostName 192.168.10.20
User oberyn
LogLevel INFO
Compression yes
- 当使用
ssh martell
, 匹配到的是:Host martell
,Host *ell
和Host *
。 实际进行连接的配置如下::
HostName 192.168.10.50
User oberyn
Compression yes
- 对于其他所有的连接,ssh 客户端会使用到
Host * !martell
和Host *
配置组里面定义的配置。
覆盖 SSH 配置文件
ssh 客户端读取配置采用一下顺序:
- 命令行定义的配置
- 定义在
~/.ssh/config
里的配置 - 定义在
/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 配置文件相关的一些简单使用场景。