如何配置自定义连接选项为您的SSH客户端

SSH或Secure Shell,是连接到Linux主机进行远程管理的最常见的方式。虽然连接到一台主机的基本知识往往相当直接的,当你开始工作这可以成为笨拙,一个更复杂的任务......

介绍

SSH或安全shell是连接到Linux主机以进行远程管理的最常见方法。 尽管连接到单个主机的基本原则往往相当简单,但当您开始使用大量远程系统时,这可能会变得不方便,并且是一个更复杂的任务。

幸运的是,OpenSSH允许您提供自定义的客户端连接选项。 这些可以保存到可用于定义每个主机值的配置文件。 这可以帮助保持您为每个主机使用的不同的连接选项分离和组织,并且可以防止您在需要连接时在命令行上提供广泛的选项。

在本指南中,我们将介绍SSH客户端配置文件的基础知识,并讨论一些常见的选项。

先决条件

要完成本指南,您需要具备SSH的工作知识和连接时可以提供的一些选项。 您可能还希望为某些用户或主机配置基于SSH密钥的身份验证,至少为了测试目的。

SSH配置文件结构和解释算法

本地系统上的每个用户都可以维护客户端SSH配置文件。 这些可以包含您将在命令行上使用以指定连接参数的任何选项,允许您存储公共连接项并在连接时自动处理它们。 它始终是可以覆盖在通过正常的标志的连接的时间配置文件中定义的值ssh命令。

SSH客户端配置文件的位置

客户端配置文件称为config ,它位于内的用户的主目录.ssh配置目录。 通常,默认情况下不会创建此文件,因此您可能需要自己创建它:

touch ~/.ssh/config

配置文件结构

config文件由主机组织。 每个主机定义可以定义特定匹配主机的连接选项。 通配符也可用于允许应具有更广范围的选项。

每个部分都以一个标题开头,该标题定义了应该与随后配置选项匹配的主机。 然后,下面定义该匹配主机的具体配置项。 只需要指定与默认值不同的项,因为主机将继承任何未定义项的默认值。 A节是从定义的Host头以下Host头。

通常,为了组织目的和可读性,为每个主机设置的选项是缩进的。 这不是一个严格的要求,但是一个有用的约定,允许一目了然更容易解释。

一般格式如下所示:

Host firsthost
    SSH_OPTION_1 custom_value
    SSH_OPTION_2 custom_value
    SSH_OPTION_3 custom_value

Host secondhost
    ANOTHER_OPTION custom_value

Host *host
    ANOTHER_OPTION custom_value

Host *
    CHANGE_DEFAULT custom_value

在这里,我们有四个部分,将应用于每个连接尝试,取决于所讨论的主机是否匹配。

解释算法

了解SSH解释文件以应用其中定义的配置值的方式非常重要。 使用通配符和时,这有很大的影响Host *通用主机定义。

SSH将匹配与每个的命令行上给出的主机名Host定义配置节头。 它将从文件的顶部向下执行此操作,因此顺序是非常重要的。

这是指出,在模式的好时机Host定义不必匹配您将要连接到实际的主机。 您基本上可以使用这些定义来设置可用于代替实际主机名的主机的别名。

例如,考虑这个定义:

Host devel
    HostName devel.example.com
    User tom

该主机允许我们作为连接tom@devel.example.com通过在命令行上键入如下:

ssh devel

考虑到这一点,我们现在可以讨论在应用每个配置选项时,SSH向下移动文件的方式。 它开始在顶部和检查每个Host定义,看看它是否在命令行上给定的值相匹配。

当第一匹配Host定义被发现,每一个相关联的SSH选项施加到即将到来的连接。 这里的解释并没有结束。

SSH然后向下移动文件,检查,看看是否有其他Host定义也相匹配。 如果找到与命令行上给定的当前主机名匹配的另一个定义,它将考虑与新节相关联的SSH选项。 然后,它将适用于那些尚未被前面的章节中定义的新部分定义的任何SSH选项。

这最后一点对于内化是非常重要的。 SSH将演绎每一个的Host匹配命令行上给出的主机名段,为了。 在此过程中,将始终使用对每个选项给定的第一个值。 没有办法重写先前匹配的部分已经给出的值。

这意味着,您config文件中应该遵循在顶部具有最具体配置的简单规则。 为了应用以前匹配部分未定义的选项,稍后应该使用更一般的定义。

让我们再次在实体模型看config ,我们在最后一节使用过的文件:

Host firsthost
    SSH_OPTION_1 custom_value
    SSH_OPTION_2 custom_value
    SSH_OPTION_3 custom_value

Host secondhost
    ANOTHER_OPTION custom_value

Host *host
    ANOTHER_OPTION custom_value

Host *
    CHANGE_DEFAULT custom_value

在这里,我们可以看到前两个部分由文字主机名(或别名)定义,这意味着它们不使用任何通配符。 如果我们连接使用ssh firsthost ,第一个部分将要应用的第一位。 这将设置SSH_OPTION_1SSH_OPTION_2SSH_OPTION_3此连接。

它会检查第二部分,发现它不匹配,并继续前进。 然后它会找到第三部分,并发现它匹配。 它将检查ANOTHER_OPTION ,看它是否已经具有用于从前面的章节的值。 发现它不会,它将应用此部分的值。 然后,它会因为在比赛最后一节Host *定义每个连接相匹配。 因为它不具有用于模拟一个值CHANGE_DEFAULT从其他部分的选择,这将需要从本节中的值。 然后使用从此过程收集的选项进行连接。

让我们再试试这个,假装叫ssh secondhost命令行。

再次,它将从第一部分开始,并检查它是否匹配。 由于这只是一个连接匹配firsthost ,它会跳过这一部分。 它将移动到第二部分。 一旦发现本节中的要求相匹配,这将收集的价值ANOTHER_OPTION此连接。

SSH然后查看第三个定义,发现通配符匹配当前连接。 然后,它会检查其是否已经有一个值ANOTHER_OPTION 由于此选项在第二部分中已定义(已匹配),因此第三部分的值将被删除并且不起作用。

然后SSH检查第四部分,并应用未由先前匹配的部分定义的选项。 然后它使用它收集的值尝试连接。

基本连接选项

现在,您对设计配置文件时应该使用的一般格式有一个想法,让我们讨论一些常见的选项和在命令行中使用的格式。

我们将介绍的第一个是连接到远程主机所需的基本信息。 即,运行SSH守护程序的主机名,用户名和端口。

要连接为一个名为用户apollo到主机名为example.com运行在端口的SSH守护4567在命令行中,我们可以给在多种方式的可变信息。 最常见的可能是:

ssh -p 4567 apollo@example.com

然而,我们也可以与使用完整的选项名称-o标志,就像这样:

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

在这里,我们将所有的我们希望与使用的选项-o标志。 我们甚至将主机指定为“任何”作为别名,就像我们在配置文件中一样,如上所述。 实际的主机名取自HostName ,我们设置选项。

我们正在使用的第二种形式的大写选项名称,我们必须在我们使用相同的config文件。 您可以通过键入以下内容找到可用选项的完整列表:

man ssh_config

要设置这些在我们的config文件,我们首先必须决定哪些主机我们要使用这些选项。 由于我们正在讨论特定于主机的选项,我们应该使用文字主机匹配。

我们还有机会在这一点为这个连接分配一个别名。 让我们利用这一点,所以我们不必每次键入整个主机名。 我们将使用别名“home”来引用此连接和相关选项:

Host home

现在,我们可以定义此主机的连接详细信息。 我们可以使用上面使用的第二种格式告诉我们应该在这一节中我们应该放在哪里。

Host home
    HostName example.com
    User apollo
    Port 4567

我们使用键值系统定义选项。 每对应在单独的行。 键可以通过空格或具有可选空格的等号与其关联值分隔开。 因此,这些都是相同的,我们的SSH客户端解释:

Port 4567
Port=4567
Port = 4567

唯一的区别是,根据选项和值,使用无符号的等号可以允许在命令行上指定一个选项,而不使用引号。 由于我们专注于我们config文件,这完全取决于你的喜好。

配置共享选项

到目前为止,我们设计的配置是令人难以置信的简单。 在整体上,它看起来像这样:

Host home
    HostName example.com
    User apollo
    Port 4567

如果我们在我们的工作和家庭计算机上使用相同的用户名怎么办? 我们可以添加冗余选项,我们的部分定义工作机器如下:

Host home
    HostName example.com
    User apollo
    Port 4567

Host work
    HostName company.com
    User apollo

这工作,但我们重复的价值观。 这只是一个选项,所以它不是一个巨大的交易,但有时我们想分享大量的选择。 这样做的最佳方式是将共享选项分成不同的部分。

如果我们用所有我们连接到机器的用户名“阿波罗”,我们可以把这个成一个单一标志着我国通用的“主机”的定义*每一个连接匹配。 记住,更通用的部分应该进一步向底部:

Host home
    HostName example.com
    Port 4567

Host work
    HostName company.com

Host *
    User apollo

这清除了我们的配置中的重复问题,如果“apollo”是您连接到的大多数新系统的默认用户名,它将工作。

如果有一些系统不使用此用户名怎么办? 有几种不同的方法可以解决这个问题,这取决于用户名的共享范围。

如果“阿波罗”的用户名在几乎所有主机中使用,它可能是最好把它留在通用Host *部分。 这将适用于以上部分没有收到用户名的任何主机。 对于使用不同用户名的异常机器,我们可以通过提供一个替代来覆盖默认值。 这将优先,只要它在通用部分之前定义:

Host home
    HostName example.com
    Port 4567

Host work
    HostName company.com

Host oddity
    HostName weird.com
    User zeus

Host *
    User apollo

对于oddity的主机,SSH连接将使用用户名“宙斯”。 所有其他的连接将无法收到自己的用户名,直到他们击中了通用Host *定义。

如果“apollo”用户名由少数连接共享,但不足以用作默认值,会发生什么情况? 如果我们愿意重命名我们使用的别名以具有更常见的格式,我们可以使用通配符将更多选项应用于这两个主机。

我们可以改变home的别名为类似hapollo和工作有关的东西像wapollo 这样一来,无论是主机共享apollo其别名的一部分,让我们使用通配符不同部分的目标是:

Host hapollo
    HostName example.com
    Port 4567

Host wapollo
    HostName company.com

Host *apollo
    User apollo

Host *
    User diffdefault

在这里,我们提出了共享User定义匹配SSH连接尝试连接到在终端主机的主机部分apollo 任何没有不散的连接apollo (和没有自己的Host部分定义User )将接收到的用户名diffdefault

请注意,我们在文件中保留了从最具体到最不具体的顺序。 最好是考虑较不具体的主机部分作为后备,而不是默认值,因为文件被解释的顺序。

常见SSH配置选项

到目前为止,我们已经讨论了建立连接所需的一些基本选项。 我们已涵盖这些选项:

  • 主机名 :应该用于建立连接的实际的主机名。 这将替换在定义的任何别名Host头。 此选项,如果是没有必要的Host定义指定实际有效的主机名来连接。
  • 用户 :用户名用于连接。
  • 端口 :远程SSH守护进程运行的端口。 如果远程SSH实例不是默认端口上运行此选项仅需要22

还有许多其他有用的选项值得探索。 我们将讨论一些更常见的选项,根据功能分开。

一般调整和连接项目

您可能希望配置在广泛的层面上,也许在其他的一些调整Host *部分,在下面。

  • ServerAliveInterval :该选项可以被配置为让SSH知道何时发送一个数据包,以测试从断绝的响应。 如果您的连接不可靠,并且您想知道它是否仍然可用,这可能是有用的。
  • LogLevel :这将配置细节在哪个SSH将记录在客户端的水平。 这可以用于在特定情况下关闭日志记录或在尝试调试时增加详细程度。 从最少到最冗长,级别是QUIET,FATAL,ERROR,INFO,VERBOSE,DEBUG1,DEBUG2和DEBUG3。
  • StrictHostKeyChecking :该选项配置是否SSH SSH永远不会自动主机添加到~/.ssh/known_hosts的文件。 默认情况下,这将被设置为“问”,这意味着它会警告你,如果从远程服务器接收到的主机密钥不匹配,一个在找到known_hosts文件。 如果您经常连接到大量临时主机,您可能需要将其设置为“no”。 然后SSH会自动将任何主机添加到文件。 这可能有安全隐患,因此在启用它之前请仔细考虑。
  • UserKnownHostsFile :此选项指定SSH将存储有关它已连接到主机上的信息的位置。 通常你不必担心这个设置,但您可能希望此设置为/dev/null ,如果你关闭了严格的主机上面的检查。
  • VisualHostKey :此选项可以告诉SSH显示在连接远程主机的按键的ASCII表示。 开启此功能可以是熟悉主机密钥的简单方法,允许您在将来某个时间从其他计算机连接时轻松识别它。
  • Compression :开启压缩可以对连接速度非常慢的帮助。 大多数用户不需要这个。

考虑到上述配置项,我们可以进行一些有用的配置调整。

例如,如果我们在云提供商处非常快地创建和销毁主机,这样的东西可能是有用的:

Host home
    VisualHostKey yes

Host cloud*
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null
    LogLevel QUIET

Host *
    StrictHostKeyChecking ask
    UserKnownHostsFile ~/.ssh/known_hosts
    LogLevel INFO
    ServerAliveInterval 120

这将打开您的家庭连接的可视主机密钥,让您熟悉它,以便您可以识别是否更改或从不同的机器连接。 我们还设置了以cloud *开头的任何主机,以便不检查主机,也不记录故障。 对于其他主机,我们有合理的后备值。

连接转发

SSH的一个常见用途是转发连接,允许本地连接通过远程主机隧道传送,或允许远程机器访问通过本地机器进行隧道传送。 SSH还可以使用SOCKS5等协议进行动态转发,包括远程主机的转发信息。

控制此行为的选项有:

  • LocalForward :该选项用于指定将本地端口的流量转发到远程机器的连接,隧道出来到远程网络。 第一个参数应该是您要引导流量的本地端口,第二个参数应该是您希望在远程端引导流量的地址和端口。
  • RemoteForward :该选项用来定义一个远程端口,其中流量可以被定向到以隧道出本地机器。 第一个参数应该是将在远程系统上定向流量的远程端口。 第二个参数应该是流量到达本地系统时指向的地址和端口。
  • DynamicForward :这是用于配置可与动态转发协议像SOCKS5使用的本地端口。 使用动态转发协议的业务可以在本地机器上的这个端口上被引导,并且在远程端,它将根据所包括的值被路由。

这些选项可用于在两个方向转发端口,如您所见:

# This will allow us to use port 8080 on the local machine
# in order to access example.com at port 80 from the remote machine
Host local_to_remote
    LocalForward 8080 example.com:80

# This will allow us to offer access to internal.com at port 443
# to the remote machine through port 7777 on the other side
Host remote_to_local
    RemoteForward 7777 internal.com:443

其他转发

除了连接转发,SSH还允许其他类型的转发。

我们可以转发存储在本地计算机上的代理中的任何SSH密钥,从而允许我们使用存储在本地系统上的凭据从远程系统进行连接。 我们还可以在远程系统上启动应用程序,并使用X11转发将图形显示转发到本地系统。

这些是与这些功能相关的指令:

  • ForwardAgent :这个选项允许存储在我们本地机器上的认证密钥转发到要连接到该系统。 这可以允许您使用主屏幕键从主机到主机。
  • ForwardX11 :如果你希望能够转发在远程系统上运行的应用程序的一个图形界面,您可以打开此选项。

这两个都是“是”或“否”选项。

指定键

如果您为主机配置了SSH密钥,这些选项可以帮助您管理用于每个主机的密钥。

  • IdentityFile :这个选项可以用于指定密钥的位置,以用于每个主机。 如果您的键位于默认位置,则每个键都将被尝试,您不需要调整。 如果你有一些键,每个键用于不同的目的,这可以用于指定正确的密钥可以找到的确切路径。
  • IdentitiesOnly :此选项可用于强制SSH仅依靠所提供的身份config文件。 如果SSH代理在内存中具有对所讨论的主机无效的备用密钥,则这可能是必需的。

如果您必须跟踪大量不同主机的密钥并使用一个或多个SSH代理来协助,这些选项尤其有用。

通过单个TCP连接复制SSH

SSH能够使用单个TCP连接到同一主机的多个SSH连接。 这可能是有用的,如果它需要一段时间建立到远程端的TCP握手,因为它消除了额外的SSH连接的这个开销。

以下选项可用于使用SSH配置复用:

  • ControlMaster :这个选项告诉SSH是否允许复用时可能。 一般来说,如果你想使用这个选项,你应该将其设置为在任一主机节是缓慢的连接或通用的“自动” Host *部分。
  • ControlPath :该选项用于指定用于控制连接的插座文件。 它应该是文件系统上的一个位置。 通常,这是使用SSH变量给主机容易地标记套接字。 要命名基于用户名,远程主机和端口插槽,可以使用/path/to/socket/ %r@%h:%p
  • ControlPersist :该选项建立在最终SSH连接已被关闭之后在TCP连接应该保持开放秒的时间量。 将此设置为较高的数字将允许您在关闭第一个连接后打开新连接,但通常可以将其设置为低到“1”,以避免保持未使用的TCP连接打开。

一般来说,你可以使用看起来像这样的部分来设置:

Host *
    ControlMaster auto
    ControlPath ~/.ssh/multiplex/%r@%h:%p
    ControlPersist 1

之后,您应该确保目录已创建:

mkdir -p ~/.ssh/multiplex

如果您不想为特定连接使用多路复用,可以在命令行上选择没有多路复用,如下所示:

ssh -S none user@host

结论

现在,应该清楚,您可以大量自定义用于连接到远程主机的选项。 只要你记住SSH解释这些值的方式,你可以建立丰富的具有合理回退的特定值集合。