介绍
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_1
, SSH_OPTION_2
和SSH_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解释这些值的方式,你可以建立丰富的具有合理回退的特定值集合。