我按照 github 教程中的说明创建了密钥,在 github 上注册了它们,并尝试显式地使用 ssh-agent ——但每次我尝试进行拉取或推送时,git 都会继续询问我的密码。
可能是什么原因?
使用以下命令启动 SSH 代理后:
eval $(ssh-agent)
执行以下任一操作:
向其中添加您的私钥: ssh-add 这将只询问您一次密码,然后您应该被允许推送,前提是您将公钥上传到 Github。要在 macOS 上永久添加和保存您的密钥: ssh-add -K 这将在您关闭并通过将其存储在用户的钥匙串中重新打开后保留它。如果您看到有关已弃用标志的警告,请尝试使用新变体: ssh-add --apple-use-keychain 要在 Ubuntu(或等效)上永久添加和保存您的密钥:ssh-add ~/.ssh/id_rsa
自从从 OS X El Capitan (10.11) 升级到 macOS Sierra (10.12) 后重新启动后,这一直发生在我身上。 ssh-add
解决方案暂时有效,但不会在再次重新启动后持续存在。
永久解决方案是编辑(或创建)~/.ssh/config
并启用 UseKeychain
选项。
Host *
UseKeychain yes
相关:macOS keeps asking my ssh passphrase since I updated to Sierra
ssh-add -K /Users/***/.ssh/git/id_rsa
,但在终端重新启动后它仍然无法正常工作...谢谢。
如果您已尝试 ssh-add
,但仍提示您输入密码,请尝试使用 ssh-add -K
。这会将您的密码短语添加到您的钥匙串中。
更新:如果您使用的是 macOS Sierra,那么您可能需要执行另一个步骤,因为上述步骤可能不再有效。将以下内容添加到您的 ~/.ssh/config
:
Host *
UseKeychain yes
我会尝试以下方法:
启动 GitBash 编辑你的 ~/.bashrc 文件 将以下行添加到文件中
SSH_ENV=$HOME/.ssh/environment
# start the ssh-agent
function start_agent {
echo "Initializing new SSH agent..."
# spawn ssh-agent
/usr/bin/ssh-agent | sed 's/^echo/#echo/' > ${SSH_ENV}
echo succeeded
chmod 600 ${SSH_ENV}
. ${SSH_ENV} > /dev/null
/usr/bin/ssh-add
}
if [ -f "${SSH_ENV}" ]; then
. ${SSH_ENV} > /dev/null
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
start_agent;
}
else
start_agent;
fi
保存并关闭文件 关闭 GitBash 重新打开 GitBash 输入您的密码
zsh
。只需将此添加到 .zshrc
id_rsa
。如果您有自定义名称,则应使用例如。 /usr/bin/ssh-add ~/.ssh/custom_filename
在 Windows 上对我有用的是(我从 repo 1st 克隆了代码):
eval $(ssh-agent)
ssh-add
git pull
那时它最后一次问我密码
ssh-add /c/Users/you_user/.ssh/id_rsa_abcxyz
尝试将此添加到您的 ~/.ssh/config 中:
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_rsa
...假设您的私钥被命名为 id_rsa
如果上述解决方案对我不起作用,要检查的一件事是您实际上也拥有公钥(通常是 id_rsa.pub
)。不这样做是不寻常的,但这就是我的原因。
从您的私钥创建您的公钥:
ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub
运行以下命令:
eval $(ssh-agent) && ssh-add ~/.ssh/id_rsa &>/dev/null
输入密码,然后检查 git。 Git 不应在此命令之后要求输入密码。
原始来源:https://gist.github.com/egoens/c3aa494fc246bb4828e517407d56718d
如果您不使用 GitBash 并且在 Windows 上 - 您需要使用此命令启动 ssh-agent
start-ssh-agent.cmd
如果您的 ssh 代理未设置,您可以以管理员身份打开 PowerShell 并将其设置为手动模式
Get-Service -Name ssh-agent | Set-Service -StartupType Manual
我有一个类似的问题,但其他答案并没有解决我的问题。我想我会继续发布这个,以防万一其他人像我一样有一个古怪的设置。
事实证明我有多个密钥,而 Git 首先使用了错误的密钥。它会提示我输入密码,我会输入它,然后 Git 会使用另一个有效的密钥(我不需要输入密码)。
我刚刚删除了它用来提示我输入密码的密钥,现在它可以工作了!
听起来您可能在使用 SSH-Agent 本身时遇到了问题。我会尝试排除故障。
1)您是否使用 ssh-add 将您的密钥添加到 SSH?
2)您是否在两次使用之间关闭了终端窗口,因为如果您关闭窗口,您将不得不在重新打开它时再次输入密码。
对于 Windows 或 Linux 用户,GitHub Docs 中描述了一种可能的解决方案,为了您的方便,我在下面报告了该解决方案。
您可以在打开 bash 或 Git shell 时自动运行 ssh-agent
。复制以下行并将它们粘贴到您的 ~/.profile
或 ~/.bashrc
文件中:
env=~/.ssh/agent.env
agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }
agent_start () {
(umask 077; ssh-agent >| "$env")
. "$env" >| /dev/null ; }
agent_load_env
# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)
if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
agent_start
ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
ssh-add
fi
unset env
如果您的私钥未存储在默认位置之一(如 ~/.ssh/id_rsa
),您需要告诉您的 SSH 身份验证代理在哪里可以找到它。要将您的密钥添加到 ssh-agent,请输入 ssh-add ~/path/to/my_key
。
现在,当您首次运行 Git Bash 时,系统会提示您输入密码。 ssh-agent
进程将继续运行,直到您注销、关闭计算机或终止该进程。
以前 -K 标志用于添加密钥,但现在:
ssh-add --apple-use-keychain
-K 和 -A 标志已弃用,并分别由 --apple-use-keychain 和 --apple-load-keychain 标志取代。
上面未提及的另一种可能的解决方案是使用以下命令检查您的遥控器:
git remote -v
如果遥控器不是以 git 开头,而是以 https 开头,您可能需要按照以下示例将其更改为 git。
git remote -v // origin is https://github.com/user/myrepo.git
git remote set-url origin git@github.com:user/myrepo.git
git remote -v // check if remote is changed
origin git@github.com/myrepo.git
我尝试了不同的解决方案,但没有任何帮助。但是来自 Bitbucket.com 接缝的这个步骤 (My GitBash SSH environment always asks for my passphrase, what can I do?) 效果很好:
这个想法是:
您创建 ~/.bashrc 文件添加以下脚本: SSH_ENV=$HOME/.ssh/environment # 启动 ssh-agent 功能 start_agent { echo "Initializing new SSH agent..." # spawn ssh-agent /usr/bin/ssh -代理 | sed 's/^echo/#echo/' > "${SSH_ENV}" echo 成功 chmod 600 "${SSH_ENV}" 。 "${SSH_ENV}" > /dev/null /usr/bin/ssh-add } if [ -f "${SSH_ENV}" ];然后 。 "${SSH_ENV}" > /dev/null ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || { 开始代理; } 否则 start_agent;重新运行 Bash
在 mac 上,如果您的 ssh 密钥每次都需要密码并且您想跳过它,那么您可以在下面尝试,它对我来说很好
eval "$(ssh-agent -s)" ssh-add -K .ssh/id_rsa 添加这个默认的 ssh 配置对我有用
主机 * AddKeysToAgent 是 UseKeychain 是 IdentityFile ~/.ssh/id_rsa
使用 SSH 而不是 HTTPS 更新源远程的 url;
git remote set-url origin "SSH URL COPIED FROM GIT REPO."
这对我有用。
如果您碰巧在使用 fish,则有一个 gist:
# config.fish
if not pgrep -f ssh-agent > /dev/null
eval (ssh-agent -c)
set -Ux SSH_AUTH_SOCK $SSH_AUTH_SOCK
set -Ux SSH_AGENT_PID $SSH_AGENT_PID
set -Ux SSH_AUTH_SOCK $SSH_AUTH_SOCK
end
也许不是解决此问题的最安全方法,但根本不设置密码,它是可选的。如果您不设置密码,它不会要求您输入密码。您可以使用更改密码
$ ssh-keygen -p -f ~/.ssh/id_ed25519
> Enter old passphrase: [Type old passphrase]
> Key has comment 'your_email@example.com'
> Enter new passphrase (empty for no passphrase): [Type new passphrase]
> Enter same passphrase again: [Repeat the new passphrase]
> Your identification has been saved with the new passphrase.
似乎您的本地存储库没有使用 ssh 密钥更新……至少这是我从 https 到 ssh 时发生的事情。
你做过远程复位吗?
git remote set-url origin <ssh url>
不定期副业成功案例分享
git pull
,再次提示我输入密码。ssh-add -K
将在您关闭并通过将其存储在用户的钥匙串中重新打开后将其保留。ssh-add -K
给出以下内容:unknown option -- K usage: ssh-add [options] [file ...] Options: -l List fingerprints of all identities. -L List public key parameters of all identities. -k Load only keys and not certificates. -c Require confirmation to sign using identities -t life Set lifetime (in seconds) when adding identities. -d Delete identity. -D Delete all identities. -x Lock agent. -X Unlock agent. -s pkcs11 Add keys from PKCS#11 provider.
-K
是苹果特有的。请参阅help.github.com/articles/…