使用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客户端配置文件的内容按节(各节)进行组织。 每个节以 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客户端逐节读取配置文件节,如果多个模式匹配,则第一个匹配节中的选项优先。 因此,应在文件开头给出更多特定于主机的声明,并在文件末尾给出更多常规替代。

您可以通过键入找到可用的ssh选项的完整列表 man ssh_config 在您的终端中或访问ssh_config手册页。

SSH配置文件也可以被其他程序读取,例如 scpsftprsync

SSH配置文件示例#

既然我们已经介绍了SSH配置文件的基本知识,让我们来看下面的示例。

通常,当通过SSH连接到远程服务器时,您将指定远程用户名,主机名和端口。 例如,以名为的用户身份登录 john 到一个叫做 dev.example.com 在港口 2322 在命令行中,您将输入:

ssh [email protected] -p 2322

要使用上面命令中提供的相同选项连接到服务器,只需键入 ssh dev,将以下几行 "~/.ssh/config 文件:

〜/ .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 tyrellHost *ellHost * !martellHost *。 在这种情况下使用的选项是:

    HostName 192.168.10.20
    User oberyn
    LogLevel INFO
    Compression yes
  • 如果你跑 ssh martell,匹配的主机模式为: Host martellHost *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 代替 john 只需在命令行上指定用户:

ssh -o "User=root" dev

-Fconfigfile)选项可让您指定每个用户的备用配置文件。

告诉 ssh 客户端忽略ssh配置文件中指定的所有选项,请使用:

ssh -F /dev/null [email protected]

结论#

我们已经向您展示了如何配置用户ssh配置文件。 您可能还希望设置基于SSH密钥的身份验证并连接Linux服务器而不输入密码。

默认情况下,SSH侦听端口22。更改默认SSH端口可降低自动攻击的风险,从而为服务器增加一层额外的安全保护。

如有任何疑问,请在下面发表评论。

SSH终端

Sidebar