繁体   English   中英

为什么 git 在 Windows 下记不住我的密码

[英]Why git can't remember my passphrase under Windows

我刚刚开始使用 git,但我无法记住我的密码我正在使用提升的 cmd.exe,我的 git 主机是 github,我已经创建了一个 ssh 密钥,就像 github 上的指南一样

但我仍然得到

*\subnus.mvc>git push origin master
Enter passphrase for key '/c/Users/Subnus/.ssh/id_rsa':

我意识到这个问题是在两年前提出的,但我遇到了同样的问题,这里的几个答案并没有完全回答我的问题。 以下是三个分步解决方案,具体取决于您是否使用 TortoiseGit 和 msysgit。

第一个解决方案假设 Windows、msysgit 和 PuTTY。

  1. 按照说明安装 msysgit 和 PuTTY。

  2. (可选)将 PuTTY 添加到您的路径。 (如果您不这样做,那么下面对 PuTTY 命令的任何引用都必须以相应可执行文件的完整路径为前缀。)

  3. 如果您还没有这样做,请按照 GitHub 或您的 Git 主机的说明生成密钥哈希。

  4. 同样,如果您还没有这样做,请使用puttygen.exe转换您的密钥以与 PuTTY 的 pageant.exe 一起使用。 说明在 PuTTY 的文档、这个有用的指南以及网络空间的其他几个地方。

  5. 运行 PuTTY 的pageant.exe ,打开您的 .ppk 文件(“添加密钥”),并为您的密钥提供密码。

  6. 访问 Windows 的环境变量对话框(右键单击“计算机”,单击“属性”,单击“高级系统设置”或“高级”选项卡,单击“环境变量”)。 添加以下环境变量:

    GIT_SSH=C:\full\path\to\plink.exe

    将 "C:\full\path\to" 替换为 PuTTY 的完整安装路径,其中找到 plink.exe。 最好将其添加到“用户变量”部分。 此外,请确保您用于 plink.exe 的路径与您用于 Pageant (pageant.exe) 的路径相匹配。 在某些情况下,您可能安装了多个 PuTTY,因为它可能与其他应用程序一起安装。 使用一个安装中的 plink.exe 和另一个安装中的 pageant.exe 可能会给您带来麻烦。

  7. 打开命令提示符。

  8. 如果您尝试连接到托管在 Github.com 的 git 存储库,请运行以下命令:

    plink.exe git@github.com

    如果您尝试连接的 git 存储库托管在其他地方,则将git@github.com替换为适当的用户名和 URL。 (假设 Github)你应该被告知服务器的主机密钥没有被缓存,并询问你是否信任它。 回答y 这会将服务器的主机密钥添加到 PuTTY 的已知主机列表中。 如果没有这一步,git 命令将无法正常工作。 按回车后,Github 会通知您 Github 不提供 shell 访问。 没关系……我们不需要它。 (如果您正在连接到其他主机,并且它为您提供了 shell 访问权限,那么最好终止链接而不做任何其他事情。)

  9. 全部完成! Git 命令现在应该可以从命令行运行。 您可能希望 pageant.exe 在启动时自动加载您的 .ppk 文件,具体取决于您需要它的频率。

第二种解决方案假设 Windows、msysgit 和 TortoiseGit。

TortoiseGit 带有 PuTTY 可执行文件和经过特殊修改的 plink 版本(称为 TortoisePlink.exe),这将使事情变得更容易。

  1. 按照说明安装 msysgit 和 TortoiseGit。

  2. 如果您还没有这样做,请按照 GitHub 或您的 Git 主机的说明生成密钥哈希。

  3. 同样,如果您还没有这样做,请使用 TortoiseGit 的puttygen.exe转换您的密钥以与 TortoiseGit 的 pageant.exe 一起使用。 说明在 PuTTY 的文档、第一个解决方案中链接的有用指南以及网络空间的其他几个地方。

  4. 运行 TortoiseGit 的pageant.exe ,打开您的 .ppk 文件(“添加密钥”)并为您的密钥提供密码。

  5. 访问 Windows 的环境变量对话框(右键单击“计算机”,单击“属性”,单击“高级系统设置”或“高级”选项卡,单击“环境变量”)。 添加以下环境变量:

    GIT_SSH=C:\full\path\to\TortoisePlink.exe

    将 "C:\full\path\to" 替换为 TortoiseGit 的完整安装路径,在该路径中找到 TortoisePlink.exe。 最好将其添加到“用户变量”部分。 此外,请确保您用于 TortoisePlink.exe 的路径与您用于 Pageant (pageant.exe) 的路径相匹配。 在某些情况下,您可能安装了多个 PuTTY,因为它可能与其他应用程序一起安装。 使用 TortoiseGit 安装中的 TortoisePlink.exe 和不同应用程序的另一个安装(或独立 PuTTY 安装)中的 pageant.exe 可能会给您带来麻烦。

  6. 全部完成! Git 命令现在应该可以从命令行运行。 当您第一次尝试连接到您的 git 存储库时,您可能会被告知服务器的主机密钥未缓存,并询问您是否信任该服务器。 点击“是”。 (这是运行中的 TortoisePlink.exe。)

    您可能希望 pageant.exe 在启动时自动加载您的 .ppk 文件,具体取决于您需要它的频率。

第三种解决方案假定 Windows、msysgit 和本机命令提示符。

  1. 安装 msysgit
  2. 确保允许在 MS-DOS 命令提示符下使用 git
  3. 运行start-ssh-agent
  4. 输入 SSH 密码
  5. 全部完成! Git 命令现在应该可以在本机命令提示符下工作。

每次设置新桌面时,我都会忘记这些说明,所以我在这里添加另一个答案,因为我同样经常偶然发现它!


像我这样不耐烦的用户的快速步骤

  1. 启用OpenSSH Authentication Agent服务并使其自动启动。
    • 👉更新👈
    • 使用最新的 Windows 更新Version 10.0.19042.867我不得不重新执行此步骤!
  2. 在命令行上使用ssh-add将您的 SSH 密钥添加到代理。
  3. 测试 git 集成,如果它仍然要求您输入密码,请继续。
  4. 将环境变量$ENV:GIT_SSH=C:\Windows\System32\OpenSSH\ssh.exe到您的会话中,或永久添加到您的用户环境中。

详细步骤:概述

Windows 与 OpenSSH 一起发布已经有一段时间了。 它包括 ssh 与 Git 一起工作的所有必要位,但它似乎仍然需要一些 TLC 才能 100% 无缝工作。 这是我从 Windows 版本 10.0.18362.449 开始成功执行的步骤(您可以通过打开 cmd.exe shell 并键入ver来查看您的 Windows 10 版本)。

我在这里假设您已经设置了 SSH 密钥,并且位于~/.ssh/id_rsa

在您的 Windows 10 机器上启用 ssh-agent 服务。

  1. 开始-> 输入“服务”并单击出现的服务应用程序。
  2. 在列表中找到OpenSSH Authentication Agent服务。
  3. 右键单击OpenSSH Authentication Agent服务,然后选择“属性”。
  4. Startup type:更改为Automatic
  5. 单击Start按钮将服务状态更改为Running
  6. 单击OK关闭对话框,然后关闭 Services 应用程序。

将您的密钥添加到ssh-agent

  1. 打开您偏好的 shell (我将在本例中使用 Windows Powershell,也适用于 Powershell Core)
  2. 将您的 SSH 密钥添加到ssh-agentssh-add (如果它与默认值不同,您可以将密钥的路径添加为第一个参数)
  3. 如果/在提示时输入您的密码。

试试 Git + SSH

  1. 打开你的 shell (同样,我使用的是 Powershell)并克隆一个 repo。 git clone git@github.com:octocat/Spoon-Knife
  2. 如果您看到此提示,请继续下一部分:
Enter passphrase for key '/c/Users/your_user_name/.ssh/id_rsa':

设置您的GIT_SSH环境变量

在任何会话中,您都可以简单地设置此环境变量,并且您的密码提示将停止出现,ssh 将代表您使用ssh-agent 或者,您可以将密码永久设置到用户的环境中。

仅在当前 shell 中设置GIT_SSH

  1. 打开您喜欢的外壳。 (对我来说是Powershell)
  2. 将环境变量 GIT_SSH 设置为适当的ssh.exe$Env:GIT_SSH=$((Get-Command -Name ssh).Source)
  3. 重试上面尝试 Git + SSH中的步骤。

永久设置GIT_SSH

  1. 打开文件资源管理器。 开始-> 键入“文件资源管理器”并在列表中单击它。
  2. 右键单击“这台电脑”,然后单击“属性”。
  3. 点击“高级系统设置”。
  4. 单击“环境变量...”按钮。
  5. 在“您的用户名的用户变量”下单击新建...
  6. Variable name:字段设置为 GIT_SSH
  7. Variable value:字段设置为 path-to-ssh.exe(通常为C:\Windows\System32\OpenSSH\ssh.exe )。
  8. 单击确定关闭新用户变量对话框。
  9. 单击“确定”关闭“环境变量”对话框。
  10. 重试上面尝试 Git + SSH中的步骤。

请注意,随着 Windows 10 的进展以及我了解更多,这可能会随着新的步骤/程序而改变。 我会尽量保持更新,期待评论中的反馈。

如果您在Windows下使用Git bash ,您可以执行以下操作:

eval `ssh-agent -s`
ssh-add ~/.ssh/*_rsa

它会在第二个命令中询问密码,就是这样。 您需要执行的每个附加操作(曾经需要密码短语)都不会要求您输入密码短语(请参见下面屏幕截图中的示例):

在 Windows 上的 Git bash 中添加密码短语

对于需要更详细说明的任何人,请参阅此页面: http ://help.github.com/working-with-key-passphrases/

问题发布后 5 年、8 个月和 6 天后的一个额外解决方案并不是一个坏主意,所以就这样吧。

注意:假设您使用的是 Windows 计算机。

  1. 下载git-credential-winstore
  2. 运行! 如果您的PATH环境变量中有 GIT,它应该可以正常工作。 如果不这样做,请运行git-credential-winstore -i C:\Path\To\Git.exe

下次您尝试提交到存储库时,系统会提示您输入您的凭据。 应该是这样的。 在您更改密码之前,不会再要求您提供凭据。


仅供您参考...您的凭据存储在 Windows 凭据存储中

你在哪里存储我的凭据?

此应用程序仅使用现有的 Windows 凭据存储来保存您的凭据。 您可以通过转到控制面板 > 用户帐户 > 凭据管理器并选择“Windows 凭据”来查看存储的凭据。 以“git:”开头的条目来自 git-credential-winstore。

那不是git,而是ssh。

我不使用Windows,但是ssh的代理概念可以为您记住密码短语。 OS X默认情况下启用了此功能。 您的ssh客户端可能有一种配置方式。

假设您想使用纯Git Bash解决方案而不使用 TortoiseGit 或 PuTTY。 此外,您不想永久存储您的密码,因为这几乎与您在没有密码的情况下生成 SSH 密钥一样。 但是您仍然想使用一些缓存。

出于缓存目的,使用了ssh-agent进程,它包含在 Git Bash 发行版中。 此过程默认不启动,因此需要先启动。 对于要缓存的任何 SSH 密钥,应使用ssh-add命令将它们添加到此进程中,该命令将提示您输入密钥的密码并将其存储在内存中。

其他解决方案的缺点:

  • GitHub 文章中的自动启动ssh-agent会在您启动 Git Bash 时从一开始就要求输入密码,无论您是否需要在此会话中使用 SSH 密钥。 如果您今天使用本地存储库,您可能只想在真正需要时提供密码(例如,在与远程存储库交互时)。
  • 如果您像GitLab 的文章中那样使用eval $(ssh-agent -s)启动ssh-agent ,您可能已经厌倦了每次都输入它。 最终,您可能已将这两行添加到.bashrc配置中以自动启动。 缺点与上述相同,还有一个额外的:每次启动新的 Git Bash 终端时,您都会获得一个额外的 ssh-agent 进程(GitHub 的 bash 脚本检查该进程是否已经启动)。
  • 就像上面两个一样,但尤其是当您为不同的主机拥有单独的 SSH 密钥时,例如一个用于 GitHub,另一个用于 GitLab,因此一次性提供它们既烦人又不方便。

因此,此解决方案适用于那些想知道如何让 Git Bash 在每个 Windows 会话中仅在真正需要时才要求输入密码的人。 它类似于 GnuPG 使用default-cache-ttl提交自动签名的密码管理行为。

配置 SSH 以在需要时仅使用 Git Bash 请求密码短语

  1. 首先,我们希望在启动 Git Bash shell 时自动启动ssh-agent 我们将为此使用修改后的 GitHub 脚本,因为它会检查进程是否已经开始,但我们不希望它立即ssh-add密钥。 该脚本转到您的~/.bashrc~/.profile~/.bash_profile~是您的用户主目录,如C:\Users\Username – 运行cd ~然后pwd让 Git Bash 将其打印出来):

     ### Start ssh-agent env=~/.ssh/agent.env agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; } agent_start () { (umask 077; ssh-agent >| "$env") # use -t here for timeout . "$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 fi unset env
  2. 现在编辑或创建一个~/.ssh/config文件,并为要打开缓存的每个主机节添加一个AddKeysToAgent选项(您也可以通过将指令放在文件开头的所有主机之前来全局打开它声明):

     # GitHub.com Host github.com Preferredauthentications publickey IdentityFile ~/.ssh/id_ed25519_github AddKeysToAgent yes # GitLab.com Host gitlab.com Preferredauthentications publickey IdentityFile ~/.ssh/id_ed25519_gitlab AddKeysToAgent yes

    从 ssh config 手册如果此选项设置为 yes 并且从文件加载密钥,则密钥及其密码将添加到具有默认生命周期的代理,就像通过 ssh-add(1) 一样。

默认的最长生命周期是永远或直到ssh-agent进程被终止(从任务管理器手动或在您的 PC 关闭时)。 如果您希望使用有限超时,您可以使用 ssh-agent 的-t参数设置它。 从上面的第一步更改 bash 脚本中的行,例如 30 分钟的密钥缓存生命周期:

(umask 077; ssh-agent -t 30m >| "$env")

有关其他时间格式限定符,请参见此处

如果您为密钥文件设置了密码,则在连接时始终需要输入该密码。 如果您创建一个无密码密钥,那么您不必每次都输入它,但是,任何有权访问您的密钥文件的人现在都可以连接到您的 github 帐户。

ssh-agent 也可以工作。 尝试运行它,看看它是否会记住您的密码。

[编辑-误读了问题,这是对相关问题的回答。 为后代留下改写版本]

我的情况是,我试图推送到托管在我们其中一台服务器上的存储库。 每当我尝试推送时,git 都会询问我的密码(nb - 密码,而不是我私钥的密码)。

通过将我的公钥添加到服务器上的授权密钥中,我能够获得对该服务器的无密码推送。 而且,因为我的私钥上没有密码(顺便说一句,这是不好的做法!)我根本不需要输入任何内容。

这是将您的公钥添加到服务器的命令。 它假定用户git是服务器上的用户。

cat .ssh/id_rsa.pub | ssh git@GIT_MASTER_IP 'cat >> .ssh/authorized_keys'

您可以通过登录服务器并手动将您的公钥附加到~/.ssh/authorized_keys文件中来实现相同的目的

我意识到这已经过了好几年了,但我偶然发现了这个问题,试图找到一个解决方案,我找到了适合所有专业水平的东西,所以我想我会分享。

GitHub 提供了一个非常有用的安装程序,让一切变得简单易用: https ://help.github.com/articles/caching-your-github-password-in-git/

您可以在用户的​​主目录中创建一个.bashrc文件,例如C:/Users/youruser ,然后放在那里:

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

每次 bash 运行后都会执行此脚本。 所以你只需要输入一次密码,当git-bash启动时!

某些版本的 bash 需要.bash_profile文件而不是.bashrc ,所以以防万一克隆.bashrc

copy .bashrc .bash_profile

如果您不介意以明文形式存储密码并且使用的是TortoiseGit,则有一个简单的解决方案。

只需在用户配置文件目录中创建_netrc文件-即在Windows 7中为C:\\Users\\MyName\\_netrc 该文件将以以下格式存储您的登录信息:

machine bitbucket.org login thisismyname password p455w0rD
machine bitbucket.org login another_account password pwdpwdPWd
machine github.com login thisismynameagain password p455w0rD

我使用TortoisePLink作为SSH客户端,它可以完美运行。

可以尝试添加 -k arg ;

ssh-add -k ~/.ssh/id_rsa

确保您的~/.ssh/config包含

UseKeychain yes

这可以防止ssh-add持久化到ssh-agent

Windows:如果您执行了@d3r3kk 中的步骤,但仍然遇到问题,请尝试以下操作:

视窗:

  • 删除 .bashrc 文件
  • 此文件通常位于 C:\Users\myusername

如何在 Windows 上正确运行 SSH-Agent

现有的答案都没有让我满意。 根据微软的说法,这是应该如何完成的:

启动具有管理员权限的 powershell 控制台:

  • ⊞ Win打开开始菜单,输入powershell ,按ctr shift enter

将 Windows 中包含的 OpenSSH 添加到PATH变量中:

setx PATH "c:/Windows/System32/OpenSSH/;$Env:PATH;" 

关闭 powershell 终端并打开一个新终端。

输入以下命令以确保 openssh 代理在后台作为服务运行:

# enable automatic start
Get-Service ssh-agent | Set-Service -StartupType Automatic

# start it now
Start-Service ssh-agent

现在服务应该正在运行,您可以通过以下方式检查

Get-Service ssh-agent

将您的私钥加载到 ssh-agent 中,例如

ssh-add $env:USERPROFILE/.ssh/id_rsa

来源: https ://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement#user-key-generation

您现在应该能够使用您的私钥,而无需每次都输入密码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM