211

我已经通过 ssh 克隆了我的 git 存储库。因此,每次我通过推或拉与源站大师通信时,我都必须重新输入我的密码。如何配置 git 以便我不需要多次输入密码?

4

14 回答 14

314

GitHub 也有类似问题,因为我使用的是 HTTPS 协议。要检查您使用的协议,只需运行

git config -l

并查看以 . 开头的行remote.origin.url。切换协议

git config remote.origin.url git@github.com:your_username/your_project.git
于 2012-05-14T12:23:37.543 回答
110

试试看ssh-add,你需要ssh-agent运行并持有你的私钥

(好的,响应更新的问题,您首先运行ssh-keygen生成一个公钥和私钥,正如Jefromi 解释的那样。您将公钥放在服务器上。您应该使用密码,如果您没有密码,则相当于普通密码-你的私钥中的文本密码。但是当你这样做时,你需要作为一个实际问题ssh-agent,如下所述。)

您希望ssh-agent在登录时在后台运行。登录后,我们的想法是运行ssh-add一次且仅一次,以便为代理提供您的密码,以解码您的密钥。然后,代理就坐在内存中,您的密钥解锁并加载,每次您在某个地方 ssh 时都可以使用。

然后所有 ssh-family 命令1将咨询代理并自动能够使用您的私钥。

在 OSX (err, macOS )、GNOME 和 KDE 系统上,ssh-agent通常会为您自动启动。我将详细介绍以防万一,像我一样,您也有 Cygwin 或其他 Windows 环境,而这肯定不适合您。

从这里开始:man ssh-agent

有多种方法可以自动运行代理。正如手册页所解释的,您可以运行它,使其成为所有登录会话其他进程的父进程。这样,它提供的环境变量将自动存在于您的所有 shell 中。当您(稍后)调用ssh-addssh两者都可以访问代理时,因为它们都具有带有魔术套接字路径名或其他内容的环境变量。

或者,您可以将代理作为普通子项运行,将环境设置保存在文件中,并在每个 shell 启动时获取该文件。

我的 OSX 和 Ubuntu 系统会自动进行代理启动设置,所以我只需运行ssh-add一次。尝试运行ssh-add并查看它是否有效,如果可以,那么您只需每次重新启动时执行一次。

我的 Cygwin 系统需要手动完成,所以我在我的.profile和我的.bashrc源代码中执行了此操作.profile

. .agent > /dev/null
ps -p $SSH_AGENT_PID | grep ssh-agent > /dev/null || {
        ssh-agent > .agent
        . .agent > /dev/null
}

.agent文件由脚本自动创建;它包含环境变量定义和导出。以上尝试获取 .agent 文件,然后尝试ps(1)代理。如果它不起作用,它会启动一个代理并创建一个新的代理文件。您也可以只运行ssh-add,如果失败则启动代理。


sudo1. 甚至使用正确的 pam 扩展名进行本地和远程操作。

于 2009-10-20T16:30:24.967 回答
29

如果您已使用HTTPS(推荐)进行克隆,则:-

git config --global credential.helper cache

进而

git config --global credential.helper 'cache --timeout=2592000'
  • timeout=2592000(30 天以秒为单位)启用缓存 30 天(或任何适合您的时间)。

  • 现在运行一个简单的 git 命令,该命令需要您的用户名和密码。

  • 输入您的凭据一次,现在缓存已启用 30 天。

  • 使用任何 git 命令再试一次,现在您不需要任何凭据。

  • 有关更多信息:-在 Git 中缓存您的 GitHub 密码

注意您需要 Git 1.7.10 或更新版本才能使用凭证助手。在系统重新启动时,我们可能需要再次输入密码。

更新#1:

如果您收到此错误git: 'credential-cache' is not a git command. See 'get --help'

然后替换git config --global credential.helper 'cache --timeout=2592000'

git config --global credential.helper 'store --file ~/.my-credentials'

更新#2:

如果您不断收到用户名和密码的提示并遇到此问题:

登录失败,使用 ctrl+c 取消基本凭证提示。

重新安装最新版本的 git对我有用。

更新#3:

作为掉电的一部分,密码身份验证被暂时禁用。请改用个人访问令牌。

  • 生成 Github accessToken
  • 取消设置现有的凭据缓存git config --global --unset credential.helper
  • git config --global credential.helper 'store --file ~/.my-credentials'
  • 任何会提示输入username&password输入 token 而不是 password 的git 命令。
于 2018-01-25T07:45:31.277 回答
27

这是关于配置 ssh,而不是 git。如果您还没有,您应该使用ssh-keygen(使用空白密码)来创建密钥对。然后,您将公钥复制到远程目标ssh-copy-id。除非您需要多个密钥(例如,一个更安全的密钥,并带有用于其他目的的密码),或者您有一些非常奇怪的多重身份信息,否则就是这么简单:

ssh-keygen   # enter a few times to accept defaults
ssh-copy-id -i ~/.ssh/id_rsa user@host

编辑:您真的应该只阅读 DigitalRoss 的答案,但是:如果您使用带有密码短语的密钥,则需要使用ssh-add <key-file>将它们添加到(如果您的发行版还没有为您运行,则ssh-agent显然启动一个)。ssh-agent

于 2009-10-20T16:29:47.527 回答
24

确保在克隆存储库时使用的是 SSH URL 而不是 HTTPS;在 repo 的克隆 URL 框中,在复制 URL 之前选择 SSH 协议。见下图:

在此处输入图像描述

于 2013-09-16T08:22:33.207 回答
9

为那些喜欢直接编辑文件而不是在 git-bash 或终端中运行命令的人扩展 Muein 的想法。

转到项目的 .git 目录(本地计算机上的项目根目录)并打开“配置”文件。然后查找 [remote "origin"] 并设置 url 配置如下:

[remote "origin"]
    #the address part will be different depending upon the service you're using github, bitbucket, unfuddle etc.
    url = git@github.com:<username>/<projectname>.git
于 2013-02-07T02:26:02.857 回答
6

我认为这里有两种不同的东西。第一个是正常的 SSH 身份验证需要用户输入帐户密码(其中帐户密码将针对不同的方法进行身份验证,具体取决于 sshd 配置)。

您可以避免使用证书输入该密码。使用证书,您仍然需要输入密码,但这一次是您的私钥的密码(与帐户密码无关)。

为此,您可以按照 steveth45 指出的说明进行操作:

使用公钥认证

如果您想避免每次都输入证书的密码,那么您可以使用 ssh-agent,正如 DigitalRoss 所指出的那样

执行此操作的确切方式取决于 Unix 与 Windows,但本质上,您需要在登录时在后台运行 ssh-agent,然后在第一次登录时,运行 ssh-add 为代理提供您的密码。然后,所有 ssh-family 命令都会咨询代理并自动获取您的密码。

从这里开始:man ssh-agent。

ssh-agent 的唯一问题是,至少在 *nix 上,您必须将证书密码放在每个新外壳上。然后证书被“加载”,您可以使用它对 ssh 服务器进行身份验证,而无需输入任何类型的密码。但这是在那个特定的外壳上。

使用钥匙串,您可以做与 ssh-agent 相同的事情,但是是“系统范围的”。打开计算机后,您打开一个外壳并输入证书的密码。然后,所有其他 shell 都将使用该“加载”证书,并且在您重新启动 PC 之前永远不会再询问您的密码。

Gnome 有一个类似的应用程序,称为Gnome Keyring,它会在您第一次使用它时询问您的证书密码,然后它会安全地存储它,这样您就不会再被询问。

于 2009-10-20T16:42:43.053 回答
4

如果您使用的是 github,他们有一个非常好的教程,可以更清楚地解释它(至少对我而言)。

http://help.github.com/set-up-git-redirect/

于 2011-12-16T06:59:44.667 回答
4
ssh-keygen -t rsa

当要求输入密码时,请将其留空,即,只需按 Enter。就如此容易!!

于 2012-06-08T11:40:16.687 回答
4

从你推的盒子里试试这个

    ssh git@github.com

然后,您应该会收到来自 github 的欢迎回复,然后推送就可以了。

于 2014-01-15T18:00:20.270 回答
2

我不得不从不允许登录 vie ssh 密钥但只能使用用户/密码的服务器克隆一个 git repo。我发现无法将 Git 插件配置为使用简单的用户/密码组合,因此我在依赖于工具 expect(apt-get install expect)的 linux 构建机器上添加了以下 shell 命令作为预构建步骤:

这不是解决此问题的好方法,因为您的密码在 JENKINS 作业的配置和日志中显示为清晰的文本!仅在无法配置 RSA 密钥身份验证或其他配置可能性的情况下使用它!

rm -rf $WORKSPACE &&
expect -c 'set timeout -1; spawn git clone USER@MYHOST:/MYPATH/MYREPO.git $WORKSPACE; expect "password:" {send "MYPASSWORD\r"}; expect eof'
于 2014-08-29T13:07:42.723 回答
1

我一直在努力避免输入密码,因为我在 Windows 上使用 ssh。我所做的是修改我的 .profile 文件,以便在特定会话中输入我的密码。所以这是一段代码:

    SSH_ENV="$HOME/.ssh/environment"

    # start the ssh-agent
    function start_agent {
        echo "Initializing new SSH agent..."
        # spawn ssh-agent
        ssh-agent | sed 's/^echo/#echo/' > "$SSH_ENV"
        echo succeeded
        chmod 600 "$SSH_ENV"
        . "$SSH_ENV" > /dev/null
        ssh-add
    }

    # test for identities
    function test_identities {
        # test whether standard identities have been added to the agent already
        ssh-add -l | grep "The agent has no identities" > /dev/null
        if [ $? -eq 0 ]; then
            ssh-add
            # $SSH_AUTH_SOCK broken so we start a new proper agent
            if [ $? -eq 2 ];then
                start_agent
            fi
        fi
    }

    # check for running ssh-agent with proper $SSH_AGENT_PID
    if [ -n "$SSH_AGENT_PID" ]; then
        ps -fU$USER | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
        if [ $? -eq 0 ]; then
      test_identities
        fi
    # if $SSH_AGENT_PID is not properly set, we might be able to load one from
    # $SSH_ENV
    else
        if [ -f "$SSH_ENV" ]; then
      . "$SSH_ENV" > /dev/null
        fi
        ps -fU$USER | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
        if [ $? -eq 0 ]; then
            test_identities
        else
            start_agent
        fi
    fi

所以有了这个,我在会话中输入我的密码一次..

于 2013-04-20T09:55:38.497 回答
1

AddKeysToAgent yes在 .ssh/config 文件的顶部添加一行。当然 ssh-agent 必须事先运行。如果它没有运行(检查prep ssh-agent),那么只需运行它eval $(ssh-agent)

现在,密钥已在系统范围内加载到内存中,您不必再次输入密码。

解决方案的来源是https://askubuntu.com/questions/362280/enter-ssh-passphrase-once/853578#853578

于 2017-08-23T20:58:05.547 回答
-1

我尝试了所有这些建议以及更多,只是为了可以从我的 AWS 实例中进行 git clone。没有任何效果。我终于绝望地作弊了:我在本地机器上复制了 id_rsa.pub 的内容,并将其附加到我的 AWS 实例上的 ~/.ssh/known_hosts 中。

于 2013-09-22T20:01:33.400 回答