如何在 Windows 和 Linux 中管理 SSH 配置文件

您的 SSH 配置文件允许您为每个 SSH 主机定义特定设置,从而更容易连接到该主机。通过在文件中定义许多这些常见或不常见的属性,无需在每次需要连接时记住此参数集。
定义 SSH 连接
如果文件 ~/.ssh/config
不存在,您可以继续创建它。通常,此文件存在于 .ssh
“隐藏”目录中,隐藏只是因为大多数操作系统不显示以 .
开头的目录。此外,该目录通常位于一个人的主目录或运行 ssh 的用户的主目录中,因此 ~
符号表示主目录。
请务必注意 .ssh
文件夹中的权限。大多数 SSH 客户端希望文件在此文件夹中的模式为 600
。如果从适用于 Linux 的 Windows 子系统引用此文件夹,您应该确保 chmod 600 ~\.ssh\*
那么,这个文件中的简单 SSH 连接是什么样的呢?下面是一个简单配置的示例。
Host my-ssh-host
HostName 10.0.0.5
Port 22
User myuser
从上面的配置可以看出,这是最基本的配置。事实上,您可以省略端口,因为它不是绝对必要的,因为 22
是默认的 SSH 端口。通过定义此连接,我们可以在命令行上简单地执行以下操作。
ssh my-ssh-host
连接通常会提示输入密码,因为 SSH 连接不应不受保护。
公钥/私钥
几乎所有 SSH 教程或设置指南通常都会在某一时刻引用公钥/私钥。这些是设置 SSH 连接的首选方法。而不是可以破解或猜测的密码,有必要实际获取密钥文件。本教程不会讨论如何创建它们,所以让我们假设一个集合已经存在并且设置正确。我们如何告诉我们的主机配置使用这个文件?
Host my-ssh-host
HostName 10.0.0.5
Port 22
User myuser
IdentityFile ~/.ssh/id_ed25519_myuser
IdentitiesOnly yes
我们在这里介绍了两个新命令。 IdentityFile
和 IdentitiesOnly
命令。首先,我们需要告诉 SSH 密钥文件在哪里,在本例中我们将文件存储在 .ssh
目录中(注意权限)。其次,我们定义了一个名为 IdentitiesOnly
的标签。这将告诉 SSH 不要尝试该文件夹中的每个身份文件,而只尝试定义的文件。默认情况下,SSH 将遍历并尝试每个身份文件,直到找到正确的文件。如果有很多身份,这通常会导致目标服务器上出现“太多用户 myuser 的身份验证失败”。
复杂配置
我们可以在本文中涵盖许多场景,但让我们回顾一些常见且有用的场景。
转发代理
如果您有这样一种情况,您已经打开了到目标服务器的 SSH 连接,然后需要从该原始目标服务器建立到第二台服务器的另一个 SSH 连接,该怎么办?您可能认为您需要在该目标服务器上存储相同的 SSH 密钥才能进行下一跳。有一个名为 ForwardAgent
的命令允许您通过设置 SSH 代理密钥转发将本地密钥“转发”到跃点中的下一个服务器。
Host my-ssh-host
HostName 10.0.0.5
Port 22
User myuser
IdentityFile ~/.ssh/id_ed25519_myuser
IdentitiesOnly yes
ForwardAgent yes
代理跳转
与 ForwardAgent
类似,通常需要通过第一个(或第二个)目标直接打开辅助 SSH 连接。很多时候这是因为一台机器可能被防火墙从一般互联网上隔离开来,但是有一个连接到一个“跳转箱”,然后允许一个人在防火墙服务器上打开一个连接。从 SSH 版本 7.3 及更高版本开始,ProxyJump
命令使我们能够轻松完成此操作。
Host my-ssh-host
HostName 10.0.0.5
Port 22
User myuser
IdentityFile ~/.ssh/id_ed25519_myuser
IdentitiesOnly yes
ForwardAgent yes
ProxyJump myuser@10.0.0.6:22,myuser2@10.0.0.7:10005
如上所示,这里有两台服务器。最初,SSH 连接将连接到 10.0.0.5
,但随后立即打开连接到 10.0.0.6
,然后它最终会使用不同的用户和端口打开连接<代码>10.0.0.7。
值得指出的是,您确实应该确保您的 SSH 服务器已锁定。
SSH 代理隧道
如果有搭建SOCKSv5隧道的需求怎么办?使用配置文件这样做很容易。我们在这里介绍三个新命令,DynamicForward
、ControlMaster
和 ControlPath
。
Host my-ssh-host
HostName 10.0.0.5
Port 22
User myuser
IdentityFile ~/.ssh/id_ed25519_myuser
IdentitiesOnly yes
DynamicForward 8080
ControlMaster auto
ControlPath ~/.ssh/%r@%h:%p
DynamicForward
命令是我们实际希望通过 SSH 连接代理的端口,例如端口 8080
。 ControlMaster
设置为 auto
,这意味着如果连接存在,则使用它,但如果不存在则创建一个新连接。最后,ControlPath
设置实际套接字文件的位置。在这种情况下,它使用 %r@%h:%p
的命名格式,在这种连接情况下对应于 myuser@10.0.0.5:22
。
结论
SSH 配置文件中有很多功能。除了在一个位置内轻松定义许多不同的主机之外,还可以定义更复杂的示例。通过这样做,不仅主机连接得到了很好的记录,而且还允许在命令行上快速轻松地访问。如果您选择将此文件置于版本控制之下,您就可以添加拥有主机运行历史记录的功能,并有可能在将来避免让您自己头疼。如您所知,SSH 配置文件使定义 SSH 主机变得容易!