场景
在使用 SSH 连接 Git 仓库时,你可能已经按照官方文档或者各大技术博客的指导生成了 SSH 密钥,并将公钥添加到 GitHub、GitLab 等平台上。但在执行 git push 或 git pull 时,系统仍然会弹出提示,要求你输入电脑(Mac)的密码。本文将详细解析这一问题的原因,并提供解决方案,让你摆脱重复输入密码的烦恼。
问题描述
尽管已经使用 SSH 协议连接仓库,但每次进行 Git 操作时,系统依然要求输入密码。这并不是 GitHub 或 GitLab 的账户密码,而是要求你输入你在生成 SSH 密钥时为私钥设置的 passphrase(密钥保护密码),或者说是用于解锁私钥的密码。
原因解析
1. SSH 密钥的 passphrase 保护
当你生成 SSH 密钥时(例如使用 ssh-keygen -t rsa -b 4096 -C "your_email@example.com"),系统会询问是否为私钥设置 passphrase。设置 passphrase 后,即使你使用了 SSH 连接,每次使用该私钥建立连接时,都需要输入该密码来解锁密钥。
参考:GitHub 官方文档 - Generating a new SSH key and adding it to the ssh-agent
2. SSH 密钥未自动加载到 SSH Agent 和钥匙串中
macOS 提供了 SSH Agent 和钥匙串功能,可以帮助缓存 SSH 密钥的解锁信息,从而避免每次操作都需要手动输入密码。如果你没有将 SSH 密钥添加到 SSH Agent 中,或者没有配置使用 macOS 的钥匙串,那么每次 SSH 连接时就会弹出密码提示。
解决方案
1. 检查并生成 SSH 密钥
首先,确保你已经在本地生成了 SSH 密钥。可以在终端中运行以下命令检查:
ls -al ~/.ssh
如果没有看到 id_rsa 和 id_rsa.pub 文件,可以使用以下命令生成:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
生成过程中,如果选择设置了 passphrase,那么记得后续需要将其缓存到 SSH Agent 和钥匙串中。
2. 启动 SSH Agent 并添加密钥到钥匙串
启动 SSH Agent:
eval "$(ssh-agent -s)"
然后,将 SSH 密钥添加到 SSH Agent,同时保存到 macOS 钥匙串中。在 macOS 10.12 及以上版本,可以使用以下命令:
ssh-add -K ~/.ssh/id_rsa
如果你的系统提示 -K 参数不可用,可以尝试:
ssh-add --apple-use-keychain ~/.ssh/id_rsa
这样,SSH Agent 会将你的私钥解锁信息缓存到钥匙串中,下次使用时就不再需要重复输入密码。
3. 配置 SSH 客户端使用钥匙串
为了确保每次使用 SSH 连接时,都能自动加载并使用钥匙串中的密钥信息,建议在 ~/.ssh/config 文件中添加如下配置(如果该文件不存在,请新建一个):
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_rsa
这段配置将确保:
- AddKeysToAgent yes:自动将密钥添加到 SSH Agent 中。
- UseKeychain yes:使用 macOS 钥匙串保存的密钥解锁信息。
- IdentityFile ~/.ssh/id_rsa:指定默认使用的私钥文件。
4. 测试 SSH 配置
完成上述步骤后,在终端中测试 SSH 连接是否正常:
ssh -T git@github.com
如果配置正确,你应该会看到类似下面的提示:
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
这说明 SSH 密钥已正确加载,后续的 git push 或 git pull 操作将不会再提示输入密码。
总结
出现每次执行 Git 操作时都要求输入电脑密码的原因,主要是因为 SSH 密钥启用了 passphrase 保护,而该密钥没有自动缓存到 SSH Agent 与 macOS 钥匙串中。通过以下步骤可以解决问题:
- 生成并确认 SSH 密钥:确保你的 SSH 密钥已经生成并正确配置。
- 启动 SSH Agent 并添加密钥到钥匙串:使用
ssh-add -K或ssh-add --apple-use-keychain命令缓存私钥解锁信息。 - 配置 SSH 客户端:在
~/.ssh/config文件中添加自动加载和使用钥匙串的配置。
按照这些步骤配置后,你将摆脱每次 Git 操作时重复输入密码的烦恼,从而让开发过程更加高效顺畅。