使用 SSH 配置文件
如果您经常通过 SSH 连接到多个远程系统,您会发现记住所有远程 IP 地址、不同的用户名、非标准端口和各种命令行选项是很困难的,甚至是不可能的。
一种选择是创建一个 bash 别名 对于每个远程服务器连接。然而,对于这个问题,还有另一种更好、更直接的解决方案。 OpenSSH 允许您设置每个用户的配置文件,您可以在其中为您连接的每台远程计算机存储不同的 SSH 选项。
本文介绍了 SSH 客户端配置文件的基础知识,并解释了一些最常见的配置选项。
先决条件
我们假设您使用的是安装了 OpenSSH 客户端的 Linux 或 macOS 系统。
SSH配置文件的位置
OpenSSH客户端配置文件名为config
,存放在用户主目录下的.ssh
目录下。
当用户第一次运行ssh
命令时,~/.ssh
目录会自动创建。 如果该目录在你的系统中不存在,用下面的命令创建它:
mkdir -p ~/.ssh && chmod 700 ~/.ssh
默认情况下,SSH 配置文件可能不存在,因此您可能需要使用 touch
命令
:
touch ~/.ssh/config
这个文件必须是可读和可写的,只能由用户使用,而不能由其他人访问。
chmod 600 ~/.ssh/config
SSH配置文件的结构和模式
SSH配置文件的结构如下。
Host hostname1
SSH_OPTION value
SSH_OPTION value
Host hostname2
SSH_OPTION value
Host *
SSH_OPTION value
SSH 客户端配置文件的内容被组织成节(section)。每个节都以Host
指令开始,包含了与远程SSH服务器建立连接时使用的特定SSH选项。
缩进不是必须的,但建议使用缩进,因为它使文件更容易阅读。
Host
指令可以包含一个模式或一个用空格分隔的模式列表。每个模式可以包含0个或更多的非空格字符或以下模式指定器之一。
*
- 匹配0个或更多的字符。 例如,Host *
匹配所有的主机,而192.168.0.*
匹配192.168.0.0/24
子网中的主机。?
- 准确地匹配一个字符。 模式,Host 10.10.0.?
匹配10.10.0.[0-9]
范围内的所有主机。!
- 当使用在模式的开头时,它否定了匹配。 例如,Host 10.10.0.* !10.10.0.5
匹配10.10.0.0/24
子网中的任何主机,但10.10.0.5
除外。
SSH客户端逐节读取配置文件,如果有多个模式相匹配,则以第一个匹配的节的选项为准。因此,更多针对主机的声明应该在文件的开头给出,而更多通用的重写则在文件的结尾。
你可以通过在终端输入man ssh_config
或访问ssh_config man page,找到可用的ssh选项的完整列表。
SSH配置文件也被其他程序读取,如scp
,sftp
,和rsync
等。
SSH配置文件的例子
现在我们已经介绍了SSH配置文件的基本知识,让我们看看下面的例子。
通常,当通过SSH连接到一个远程服务器时,你会指定远程用户名、主机名和端口。例如,在命令行中,如果要以一个名为john
的用户登录到一个名为dev.example.com
的主机上,端口为2322
,你可以输入。
ssh john@dev.example.com -p 2322
要使用与上述命令中提供的相同的选项连接到服务器,只需输入ssh dev
,将以下几行放到你的"~/.ssh/config
文件中。
Host dev
HostName dev.example.com
User john
Port 2322
现在,当你输入ssh dev
时,ssh客户端将读取配置文件,并使用为dev
主机指定的连接细节。
ssh dev
共享的SSH配置文件示例
这个例子给出了关于主机模式和选项优先级的更详细的信息。
让我们来看看下面的例子文件。
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
(意味着除了martell
以外的所有主机),它将应用这个节的连接选项。最后一个定义Host *
也是匹配的,但ssh客户端将只采用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
而不是john
的身份连接,只需在命令行上指定用户即可。
ssh -o "User=root" dev
-F
(configfile
)选项允许你指定一个可供选择的每个用户的配置文件。
要告诉 ssh
客户端忽略所有在 ssh 配置文件中指定的选项,使用。
ssh -F /dev/null user@example.com
总结
我们已经告诉你如何如何配置你的用户ssh配置文件。你可能还想设置一个基于SSH密钥的认证,无需输入密码就可以连接到你的Linux服务器。
默认情况下,SSH监听端口为22。改变默认的SSH端口通过减少自动攻击的风险,为你的服务器增加了一个额外的安全层。
如果你有任何问题,请在下面留言。