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

介绍

SSH ,或** S** ecure** Sh** ell,是连接到Linux服务器的最常见方式,用于远程管理,虽然通过命令行连接到单个服务器相对简单,但对于连接到多个远程系统有许多工作流的优化。

OpenSSH 是大多数系统中最常用的命令行 SSH 客户端,允许您提供自定义连接选项,这些选项可以保存到包含每个服务器不同的选项的配置文件中。

在本指南中,我们将涵盖SSH客户端配置文件的结构,并讨论一些常见的选项。

前提条件

要完成本指南,您将需要对SSH和您连接时可以提供的一些选项的熟练知识。您还应该为部分用户或服务器配置(https://www.digitalocean.com/community/tutorial_collections/how-to-set-up-ssh-keys),至少用于测试目的。

SSH Config 文件结构和解释算法

您的系统上的每个用户都可以在其主目录中维护自己的SSH配置文件,这些文件可以包含您在命令行中使用的任何选项,以指定连接参数。

SSH 客户端配置文件的位置

客户端配置文件位于 ~/.ssh/config - ~ 是您主目录的通用捷径. 通常,此文件不是默认创建的,因此您可能需要自己创建它。

1touch ~/.ssh/config

配置文件结构

config文件由 hosts ,即通过远程服务器组织。每个主机定义可以为特定匹配主机定义连接选项。

每个部分都从一个标题开始,定义了应该匹配下面的配置选项的主机。 然后,该匹配主机的特定配置项目被定义在下方。 只需要指定与默认值不同的项目,因为每个条目将继承任何未定义项目的默认项目。

通常,为了组织目的和可读性,为每个主机设置的选项被注明,这不是一个艰难的要求,而是一个有用的公约,允许一眼就能解释。

总体格式将看起来像这样的东西:

 1[label ~/.ssh/config]
 2Host firsthost
 3    Hostname your-server.com
 4    User username-to-connect-as
 5    IdentityFile /path/to/non/default/keys.pem
 6
 7Host secondhost
 8    ANOTHER_OPTION custom_value
 9
10Host *host
11    ANOTHER_OPTION custom_value
12
13Host *
14    CHANGE_DEFAULT custom_value

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

解读算法

重要的是要了解 SSH 将如何解释文件以应用配置值,这在使用 wildcards 和Host * 通用主机定义时会产生影响。

SSH 将与命令行中提供的主机名称与定义配置部分的每个主机标题匹配。

例如,考虑这个定义:

1[label ~/.ssh/config]
2Host devel
3    HostName devel.example.com
4    User tom

这个主机允许我们通过在命令行中键入以下方式来连接为[email protected]:

1ssh devel

SSH从配置文件的顶部开始,并检查每个主机定义,看看它是否匹配命令行中给出的值。

SSH 然后将文件移动下来,检查其他主机定义是否也匹配. 如果发现另一个定义匹配命令行上提供的当前主机名称,它将考虑与新节相关的 SSH 选项。

SSH将按照命令行中给出的主机名称相匹配的每个主机部分进行解释,在这个过程中,它将始终使用每个选项的第一个值。

這意味著您的「config」檔案應該遵循最具特定的配置規則,而更廣泛的定義應該在稍後出現,以便適用以前的匹配部分未定義的選項。

让我们再来看看上一节的例子:

 1[label ~/.ssh/config]
 2Host firsthost
 3    Hostname your-server.com
 4    User username-to-connect-as
 5    IdentityFile /path/to/non/default/keys.pem
 6
 7Host secondhost
 8    ANOTHER_OPTION custom_value
 9
10Host *host
11    ANOTHER_OPTION custom_value
12
13Host *
14    CHANGE_DEFAULT custom_value

在这里,我们可以看到,前两个部分是由字面主机名(或副名称)定义的,这意味着它们不使用任何 wildcards. 如果我们使用ssh firsthost连接,那么第一个部分将是第一个应用。

它将检查第二节,发现它不匹配和前进。 然后它会找到第三节 并发现它匹配。 它将检查Another_OPTION',看看它是否已经对前几节有价值。 发现它没有,它将应用本节的值. 然后,它将与最后一个部分相匹配,因为Host QQ定义与每个连接相匹配。 由于它没有其他部分对模拟Change_DEFAULT ' 选项的价值,它将取自本部分的价值。 然后与从这一进程中收集的选项进行连接.

让我们再试一次,假装从命令行中调用ssh secondhost

再次,它将从第一个部分开始,并检查是否匹配。因为这只匹配一个连接到firsthost,它将跳过这个部分。

SSH 然后查看第三个定义,并发现 wildcard 匹配当前的连接. 然后它会检查它是否已经有 ANOTHER_OPTION 的值。

SSH 然后检查第四部分,并应用以前未被匹配的部分定义的选项,然后尝试使用所收集的值进行连接。

连接选项

现在你已经有了如何编写配置文件的想法,让我们讨论一些常见的选项和使用的格式,以在命令行中指定它们。

首先我们将涵盖连接到远程主机所需的最低设置,即主机名、用户名和端口,SSH服务器正在运行。

要作为一个名为apollo的用户连接到一个名为example.com的主机,该主机在命令行上的4567端口上运行其SSH对象,你可以这样运行ssh:

1ssh -p 4567 [email protected]

但是,您也可以使用-o旗的完整选项名称,如下:

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

您可以在 SSH 手册页面找到可用的选项的完整列表。

要在您的config文件中设置这些,您必须选择一个主机标题名称,例如主机:

1Host home
2    HostName example.com
3    User apollo
4    Port 4567

常见 SSH 配置选项

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

HostName :将用于建立连接的实际主机名称. 这取代了主机标题中定义的任何名称。如果主机定义指定了要连接的实际有效地址,则此选项不必要。* 用户* :将用于连接的用户名。

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

一般 tweaks 和连接项目

ServerAlive Interval * 翻译: 此选项可以配置, 以便让 SSH 知道何时发送数据包测试服务器的响应 。 如果您的连接不可靠, 并且您想知道它是否仍然可用, 这会有所帮助 。

  • 数据层: 这将配置 SSH 在客户端登录的详细级别 。 这可用于在某些情况下关闭伐木,或者在尝试调试时会增加动词. 从最少到大多数动词,关卡为QUIET,FATAL,ERROR,INFO,VERBOSE,DEBUG1,DEBUG2和DEBUG3.
  • TrittHostKey检查 ` : 此选项将配置 ssh SSH 是否将自动添加主机到 QQ/. ssh/ 已知_ hosts' 文件 。 默认情况下, 这将设定为),您可能想要将它变成"不". 然后 SSH 会自动添加任意主机到文件 。 如果已知主机在不该更改地址时做更改,
  • 用户知道HostsFile * 此选项指定了 SSH 存储它所连接的主机信息的位置 。 通常你不必担心这个设置,但你也许希望把它设定为‘/dev/null' 所以,如果你关闭了严格的主机 检查上面。
  • 视频HostKey : 此选项可以让SSH在连接时显示远程主机密钥的 ASCII 表示. 打开这个可以成为熟悉主机的钥匙的有用方法, 如果你需要在未来某个时候从另一个计算机上连接, 就可以识别它。
  • 压缩: 打开压缩可以帮助非常慢的连接. 大多数用户不需要这个. .

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

例如,如果我们在云提供商中快速创建和破坏主机,那么这样的东西可能很有用:

 1Host home
 2    VisualHostKey yes
 3
 4Host cloud*
 5    StrictHostKeyChecking no
 6    UserKnownHostsFile /dev/null
 7    LogLevel QUIET
 8
 9Host *
10    StrictHostKeyChecking ask
11    UserKnownHostsFile ~/.ssh/known_hosts
12    LogLevel INFO
13    ServerAliveInterval 120

这将为您的家庭连接打开您的视觉主机密钥,允许您熟悉它,以便您可以识别它是否发生变化或从不同的机器连接时。

连接前进

SSH的一个常见用途是传输连接,无论是允许本地连接通过远程主机隧道,还是允许远程机器通过本地机器访问隧道。

控制这种行为的选项是:

  • 地方前进 ` : 此选项用于指定一个连接, 将本地端口的流量传送到远程机器上, 将它通向远程网络 。 第一个论点应该是您希望引导交通前往的地方港口,第二个论点应该是您希望引导交通到远端的地址和港口。
  • 未来 ` : 此选项用于定义一个远程端口,可以引导到该端口的交通,以通向本地机器外出. 第一个论点应当是交通将导向远程系统的偏远港口。 第二个论点应该是交通到达当地系统时的地址和端口。
  • 动态前导: 用于配置本地端口, 可以使用 SOCKS5 这样的动态转发协议 。 使用动态转发协议的流量,然后可以在本地机器上被指向这个端口,而远程端口则会按照包含的值进行路由. .

这些选项可以用来向两个方向发送端口,如下所示:

1# This will allow us to use port 8080 on the local machine
2# in order to access example.com at port 80 from the remote machine
3Host local_to_remote
4    LocalForward 8080 example.com:80
5
6# This will allow us to offer access to internal.com at port 443
7# to the remote machine through port 7777 on the other side
8Host remote_to_local
9    RemoteForward 7777 internal.com:443

这是特别有用的,当你需要打开一个浏览器窗口到一个私人仪表板或在服务器上运行的其他Web应用程序,而不是通过SSH直接访问。

其他发送

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

您可以转发在本地机器上的代理中存储的任何SSH密钥,允许我们使用存储在本地系统上的身份验证来连接远程系统。您也可以在远程系统上启动应用程序,并使用X11转发将图形显示向本地系统。X11是一个Linux显示服务器,没有Linux桌面系统就无法使用,但如果您正在使用远程和本地Linux环境,则非常有用。

以下是与这些能力相关的指令:

*ForwardAgent :此选项允许存储在本地机器上的身份验证密钥被转移到您正在连接的系统.这可以允许您使用您的主机密钥从主机跳到主机。

指定密钥

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

IdentityFile :此选项可以用来指定每个主机使用的密钥的位置。SSH将默认使用位于~/.ssh中的密钥,但如果您有每个服务器分配的密钥,可以用此来指定可以找到密钥的确切路径。* IdentitiesOnly* :此选项可以用来迫使SSH仅依赖于config文件中提供的身份。

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

结论

只要您记住 SSH 将如何解释值,您可以建立丰富的特定值集,并有合理的倒退。

如果您在飞机 Wi-Fi 等非常差或间歇性连接上使用 SSH,您也可以尝试使用 mosh,该连接旨在使 SSH 在不利的情况下工作。

Published At
Categories with 技术
comments powered by Disqus