如果您每天都需要定期通过SSH连接到多个远程系统,您会发现记住所有远程IP地址,不同的用户名,非标准的默认端口和各种命令行选项是很困难。
一种选择是为每个远程服务器连接创建一个bash别名。但是,对于这个问题,还有另一种更好,更简单的解决方案。OpenSSH允许您为每个用户设置配置文件,您可以为每台远程计算机存储不同的SSH选项。
本教程介绍了SSH客户端配置文件的基础知识,并介绍了一些最常用的配置选项。
前提条件
你Linux或macOS系统已安装了OpenSSH客户端。
SSH配置文件位置
OpenSSH客户端配置文件存储在用户家目录下的.ssh
目录中~/.ssh
。当用户第一次运行ssh命令时,将自动创建该目录并创建配置文件config
如果您从未使用过ssh,则需要使用以下command
命令创建目录:
mkdir -p ~/.ssh && chmod 700 ~/.ssh
默认情况下,SSH配置文件可能不存在,因此您可能需要使用touch命令创建它:
touch ~/.ssh/config && chmod 600 ~/.ssh/config
此文件必须只能由用户读写,并且其他人无法访问:
chmod 700 ~/.ssh/config
SSH配置文件结构和模式
SSH配置文件采用以下结构:
Host hostname1
SSH_OPTION value
SSH_OPTION value
Host hostname2
SSH_OPTION value
Host *
SSH_OPTION value
SSH客户端配置文件的内容每一部分称为一节。每个节都以Host
指令开头,并包含远程SSH服务器建立连接时使用的特定SSH选项。
缩进不是必需的,但建议使用缩进,因为它会使文件更易于阅读。
Host
指令可以包含一个模式或以空格分隔的模式列表。每个模式可以包含零个或多个非空白字符或以下模式说明符之一:
*
- 匹配零个或多个字符。例如,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手册页来查找可用ssh选项的完整列表。
SSH的配置文件也被其他程序使用,如scp
,sftp
和rsync
。
基本SSH配置文件示例
现在我们已经介绍了SSH配置文件的基础知识,让我们看一下下面的例子。
通常,当您通过SSH连接到远程服务器时,您将指定远程用户名,主机名和端口。例如,为了连接到指定用户john
到一个名为主机dev.example.com
端口2322
的命令行,键入:
ssh john@dev.example.com -p 2322
如果您想简化上面的命令,并提供的相同选项连接到服务器,只需键入命名ssh dev
即可连接远程主机,但您需要将以下行放入您的"~/.ssh/config
文件:
〜/.ssh/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
,除了martell
它之外的所有主机,它将应用此节中的连接选项。最后,最后一个定义Host *
也是匹配的,但ssh客户端只采用Compression
选项,因为User
选项已在该Host 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
- 对于所有其他连接
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端口可以降低自动攻击的风险,从而为服务器增加额外的安全层。
如果您有任何疑问,请在下面留言。如果你喜欢我们的内容可以选择在下方二维码中捐赠我们,或者点击广告予以支持,感谢你的支持