跳至主要内容

使用 SSH 代理转发

为了简化向服务器的部署,您可以设置 SSH 代理转发,以安全地使用本地 SSH 密钥。

SSH 代理转发可用于简化向服务器的部署。它让您可以使用本地 SSH 密钥,而不是在服务器上保留(未加密的)密钥。

如果您已经设置了用于与 GitHub 交互的 SSH 密钥,您可能已经熟悉 ssh-agent。它是一个在后台运行的程序,会将您的密钥加载到内存中,这样您就不需要每次使用密钥时都输入密码短语。巧妙之处在于,您可以让服务器访问您本地的 ssh-agent,仿佛它们已经在服务器上运行。这有点像让朋友输入他们的密码,让您使用他们的电脑。

查看 Steve Friedl 的技术提示指南,了解有关 SSH 代理转发的更详细解释。

设置 SSH 代理转发

确保您自己的 SSH 密钥已设置并可正常工作。如果您尚未完成此操作,可以使用我们的 SSH 密钥生成指南

您可以在终端中输入 ssh -T git@github.com 来测试本地密钥是否有效

$ ssh -T git@github.com
# Attempt to SSH in to github
> Hi USERNAME! You've successfully authenticated, but GitHub does not provide
> shell access.

我们已经有了一个很好的开端。让我们设置 SSH,以允许对您的服务器进行代理转发。

  1. 使用您喜欢的文本编辑器,打开 ~/.ssh/config 文件。如果此文件不存在,您可以在终端中输入 touch ~/.ssh/config 来创建它。

  2. 在文件中输入以下内容,将 example.com 替换为您的服务器域名或 IP 地址

     Host example.com
       ForwardAgent yes
    

警告

您可能会想使用通配符,如 Host *,将此设置应用于所有 SSH 连接。但这并不是一个好主意,因为这会让您本地的 SSH 密钥共享给您 SSH 进入的 每一台 服务器。它们虽然不能直接访问密钥,但在连接建立期间可以 以您的身份 使用它们。您应仅添加可信且计划使用代理转发的服务器。

测试 SSH 代理转发

要测试代理转发在服务器上是否正常工作,您可以再次 SSH 进入服务器并运行 ssh -T git@github.com。如果一切顺利,您将收到与本地相同的提示。

如果您不确定本地密钥是否被使用,也可以检查服务器上的 SSH_AUTH_SOCK 变量

$ echo "$SSH_AUTH_SOCK"
# Print out the SSH_AUTH_SOCK variable
> /tmp/ssh-4hNGMk8AZX/agent.79453

如果该变量未设置,则表示代理转发未生效

$ echo "$SSH_AUTH_SOCK"
# Print out the SSH_AUTH_SOCK variable
> [No output]
$ ssh -T git@github.com
# Try to SSH to github
> Permission denied (publickey).

排查 SSH 代理转发问题

以下是排查 SSH 代理转发时需要注意的一些事项。

您必须使用 SSH URL 来检出代码

SSH 转发仅适用于 SSH URL,而不适用于 HTTP(s) URL。检查服务器上的 .git/config 文件,确保 URL 为如下的 SSH 形式。

[remote "origin"]
  url = git@github.com:YOUR_ACCOUNT/YOUR_PROJECT.git
  fetch = +refs/heads/*:refs/remotes/origin/*

您的 SSH 密钥必须在本地可用

在通过代理转发使用密钥之前,必须先确保它们在本地可用。我们的 SSH 密钥生成指南可以帮助您在本地设置 SSH 密钥。

您的系统必须允许 SSH 代理转发

有时,系统配置会禁止 SSH 代理转发。您可以在终端中输入以下命令来检查是否使用了系统配置文件。

$ ssh -v URL
# Connect to the specified URL with verbose debug output
> OpenSSH_8.1p1, LibreSSL 2.7.3
> debug1: Reading configuration data /Users/YOU/.ssh/config
> debug1: Applying options for example.com
> debug1: Reading configuration data /etc/ssh_config
> debug1: Applying options for *
$ exit
# Returns to your local command prompt

在上面的示例中,首先加载文件 ~/.ssh/config,随后读取 /etc/ssh_config。我们可以运行以下命令检查该文件是否覆盖了我们的选项。

$ cat /etc/ssh_config
# Print out the /etc/ssh_config file
> Host *
>   SendEnv LANG LC_*
>   ForwardAgent no

在此示例中,我们的 /etc/ssh_config 文件明确写有 ForwardAgent no,这会阻止代理转发。删除该行后,代理转发应再次工作。

您的服务器必须在入站连接上允许 SSH 代理转发

代理转发也可能在服务器上被阻止。您可以通过 SSH 登录服务器并运行 sshd_config 来检查是否允许代理转发。该命令的输出应显示已设置 AllowAgentForwarding

本地的 ssh-agent 必须正在运行

在大多数计算机上,操作系统会自动为您启动 ssh-agent。但在 Windows 上,您需要手动启动。我们有一篇关于在打开 Git Bash 时如何启动 ssh-agent 的指南

要验证 ssh-agent 是否在您的计算机上运行,请在终端中输入以下命令

$ echo "$SSH_AUTH_SOCK"
# Print out the SSH_AUTH_SOCK variable
> /tmp/launch-kNSlgU/Listeners

您的密钥必须对 ssh-agent 可用

您可以运行以下命令检查您的密钥是否对 ssh-agent 可见

ssh-add -L

如果命令提示没有可用的身份,您需要添加您的密钥

ssh-add YOUR-KEY

提示

在 macOS 上,ssh-agent 在系统重启后会“忘记”该密钥。但您可以使用以下命令将 SSH 密钥导入钥匙串。

ssh-add --apple-use-keychain YOUR-KEY

注意

--apple-use-keychain 选项在您将 SSH 密钥添加到 ssh-agent 时,会把密码短语存储在钥匙串中。如果您没有为密钥添加密码短语,请在运行命令时省略 --apple-use-keychain 选项。

--apple-use-keychain 选项位于 Apple 标准版的 ssh-add 中。在 macOS Monterey(12.0)之前的版本中,--apple-use-keychain--apple-load-keychain 标志分别使用 -K-A 语法。

如果您未安装 Apple 标准版的 ssh-add,可能会收到错误。更多信息请参见 Error: ssh-add: illegal option -- apple-use-keychain

如果仍然提示输入密码短语,您可能需要将该命令添加到 ~/.zshrc 文件(或对于 bash,添加到 ~/.bashrc 文件)中。

© . This site is unofficial and not affiliated with GitHub, Inc.