• .ssh/config 文件的解释算法及配置原则


    前言

    SSH 是连接远程主机最常用的方式,尽管连接到单个主机的基本操作非常直接,但当你开始使用大量的远程系统时,这就会成为笨重和复杂的任务。

    幸运的是,OpenSSH 允许您提供自定义的客户端连接选项。这些选项可以被存储到一个配置文件中,这个配置文件可以用来定义每个主机的配置。这有助于保持每个主机的连接选项更好的独立和组织,也你让你在需要连接时避免在命令行中写繁琐的选项。

    在本文中,我们将介绍 SSH 客户端配置文件的基本知识,了解 SSH 如何解释配置文件,但不会介绍 SSH 具体选项的含义及使用。

    SSH 文件的结构及解释算法

    本地系统的每个用户都可以维护一个客户端的 SSH 配置文件,这个配置文件可以包含你在命令行中使用 ssh 时参数,也可以存储公共连接选项并在连接时自动处理。你可以在命令上中使用 ssh 来指定 flag ,以覆盖配置文件中的选项。

    SSH 客户端配置文件的位置

    配置文件的文件名为 config ,位于用户 home 目录下的 .ssh 文件夹下。

    ~/.ssh/config
    

    通常,该文件不是默认创建的,因此你可能要自己创建它。

    配置文件的结构

    配置文件通过 Host 来组织,每一个 Host 定义项为匹配的主机定义连接选项。通配符可以用,为了让选项有更大的范围。

    配置文件看起来是这样的:

    Host firsthost
        SSH_OPTIONS_1 custom_value
        SSH_OPTIONS_2 custom_value
        SSH_OPTIONS_3 custom_value
    
    Host secondhost
        ANOTHER_OPTION custom_value
    
    Host *host
        ANOTHER_OPTION custom_value
    
    Host *
        CHANGE_DEFAULT custom_value
    

    解释算法

    只有理解 SSH 怎么解释配置文件,你才能写出合理的配置文件。

    SSH 使命令行中给出的主机名与配置文件中定义的 Host 来匹配。它从文件顶部向下执行此操作,所以顺序非常重要。

    现在是指出 Host 定义中的模式不必与您要连接的实际主机匹配的好时机。 实际上,您可以使用这些定义为主机设置别名,以替代实际的主机名。

    看个例子:

    Host dev1
        HostName dev1.example.com
        User tom
    

    现在要连接到 tom@dev1.example.com,就可以通过在命令行中输入如下命令:

    ssh dev1
    

    记住这一点,我们现在继续讨论在由上而下的过程中,SSH 怎么应用每一个配置选中。它从顶部开始,检查每一个 Host 定义是否与命令行中给出的主机匹配。在上一个例子中,就是检查 dev1 。

    当找到第一个匹配的主机定义时,每个关联的SSH选项都将应用于即将到来的连接(为了方便下边的讨论,这里我们称该连接接为“连接a”)。 尽管如此,解释并没有结束。

    SSH 继续在文件中向下查找,检查是否有其他匹配的 Host 定义。如果有另一个 Host 定义匹配,SSH 将考虑该 Host 定义下的配置选项。如果新的配置选项中有 连接a 咱时没有使用的选项,就把这些选项也加入 连接a 中。

    总结一下,SSH 将按顺序解释与命令行上给出主机名匹配的每个 Host 定义。在这个过程中,SSH 始终使用为每个选项给出的第一个值。没有办法覆盖之前已经匹配的 Host 定义给出的值。

    这样看来,写配置文件的一个简单的原则是。越细化的 Host 定义,要写在上边。通用的 Host 定义,要写在下边。

    看个例子:

    Host firsthost
        SSH_OPTIONS_1 custom_value1
        SSH_OPTIONS_2 custom_value2
        SSH_OPTIONS_3 custom_value3
    
    Host secondhost
        ANOTHER_OPTION custom_value4
    
    Host *host
        ANOTHER_OPTION custom_value5
    
    Host *
        CHANGE_DEFAULT custom_value6
    

    如果 ssh firsthost ,那么 SSH 使用的选项有 SSH_OPTIONS_1SSH_OPTIONS_2SSH_OPTIONS_3ANOTHER_OPTIONCHANGE_DEFAULT ,使用的值分别为 custom_value1custom_value2custom_value3custom_value5custom_value6

    如果 ssh secondhost,那么 SSH 使用的选项有 ANOTHER_OPTIONCHANGE_DEFAULT ,使用的值分别为 custom_value4custom_value6

    基本的连接选项

    这部分直接用实例来解释:要将名为 apollo 的用户连接到名为 example.com,该主机在 4567 端口上运行 SSH 守护程序。

    一般情况下,我们会在命令行在这么写:

    ssh -p 4567 apollo@example.com
    

    如果使用选项的全名,是这样的:

    ssh -o "User=apollo" -o "Port=4567" -o "HostName=example.com"
    

    我们可以把第二种方式中大写字母开头的选项放到配置文件中。可以通过 man ssh_config 来获取完整的可用的选项列表。

    现在,用配置文件写一下上边的例子:

    Host home
        HostName example.com
        User apollo
        Port 4567
    

    对每个选项而言,这样写也可以(以Port为例):

    Port = 4567
    Port=4567
    

    配置共享的选项

    继续上一部分的例子,我又两个主机,分别 home 和 work ,在两台主机上,我的用户名都是 apollo。简单,直接修改配置文件:

    Host home
        HostName example.com
        User apollo
        Port 4567
    
    Host work
        HostName company.com
        User apollo
    

    这样写没有问题,但是我们可以把 User 提出来:

    Host home
        HostName example.com
        Port 4567
    
    Host work
        HostName company.com
    
    Host *
        User apollo
    

    非常不错,不过新问题来了,你有一个好朋友 Mars ,有一个主机共享给你用,但他喜欢把你的名字倒着念,那么该怎么办?

    Host home
        HostName example.com
        Port 4567
    
    Host work
        HostName company.com
    
    Host friend-Mars
        HostName abc.com
        User ollopa
    
    Host *
        User apollo
    

    随着时间流逝,朋友越来越多,他们都有主机给你用,而且都喜欢把你的名字倒着念,那该怎么办?

    Host home
        HostName example.com
        Port 4567
    
    Host work
        HostName company.com
    
    Host friend-Mars
        HostName mars.com
    
    Host friend-Mercury
        HostName mercury.com
    
    Host friend-Jupiter
        HostName jupiter.com
    
    Host friend-*
        User ollopa
    
    Host *
        User apollo
    

    原文为How To Configure Custom Connection Options for your SSH Client,本文在原文的基础上略有修改。


    文章链接: https://www.cnblogs.com/xjshi/p/9146296.html

    转载请注明住处

  • 相关阅读:
    scala的Class
    scala的Map
    log4j配置文件详细解释
    学习线程1之建立线程,并启动
    Spring中WebApplicationContext的研究
    Log4j 配置 的webAppRootKey参数问题
    JNDI绑定数据库
    Struts2配置之Struts.properties
    Java多线程-工具篇-BlockingQueue
    StringUtils判断字符串是否为空的方法
  • 原文地址:https://www.cnblogs.com/xjshi/p/9146296.html
Copyright © 2020-2023  润新知