使用 SSH 配置文件

评论 0 浏览 0 2019-01-07

如果您经常通过 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配置文件也被其他程序读取,如scpsftp,和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 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

-F (configfile)选项允许你指定一个可供选择的每个用户的配置文件。

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

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

总结

我们已经告诉你如何如何配置你的用户ssh配置文件。你可能还想设置一个基于SSH密钥的认证,无需输入密码就可以连接到你的Linux服务器。

默认情况下,SSH监听端口为22。改变默认的SSH端口通过减少自动攻击的风险,为你的服务器增加了一个额外的安全层。

如果你有任何问题,请在下面留言。

最后更新2023-06-06
0 个评论
标签