通过SSH配置Git登录一次


195

我已经通过ssh克隆了我的git存储库。因此,每次我通过推或拉与原始主机通信时,都必须重新输入密码。如何配置git,这样我就不需要多次输入密码了?


7
似乎是一个安全问题,您无需使用任何密码即可进行常规提交,但您想重新进行身份验证的是推送类型,但也许我是过时的。
亚历克斯·塞克斯顿2009年

Answers:


104

试试看ssh-add,您需要ssh-agent运行并按住私钥

(好吧,回答更新后的问题,首先您要运行ssh-keygen生成Jepublici 解释的公钥和私钥。将公钥放置在服务器上。如果没有密码,则应该使用密码短语。私钥中输入-text密码。但是,这样做时,实际上需要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,如果运行失败,则启动代理。


1.甚至本地和远程都sudo带有正确的pam扩展名。


1
与其从源中采购产品,不如ssh-agent使用它:eval `ssh-agent`
scottsome

285

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

git config -l

然后看一下以开头的行remote.origin.url。切换协议

git config remote.origin.url git@github.com:your_username/your_project.git

12
我认为这应该是官方答案,^ 5 @Muein!
马丁·马丁

14
当回购是私人的并且您不是所有者时,这将不起作用。我只是遇到一个Permission denied错误。
ogzd 2013年

7
这仅适用于一个仓库,我如何在全球范围内制作它?
onmyway133'2014-10-12

2
@ogzd GitHub(或您正在使用的任何服务)需要您的公共SSH密钥才能起作用,但这仍然是正确的解决方案。
MattM

一个替代方法是git remote set-url origin git@github.com:your_username/your_project.git
icosamuel

24

这是关于配置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-agentssh-agent如果您的发行版中没有正在运行的密钥,显然会启动一个密钥)。


2
我不确定这是否能回答问题,他一定已经做到了,否则将无法访问该站点。他需要的答案是: ssh-agent,因为他想绕过每次输入密码短语的问题。不能
拒绝投票

2
@DigitalRoss:啊,我从阅读问题并不确定OP是否真的设置了密钥。不过,您可能是对的,我有意建议不要使用密码短语。但是,您当然是正确的ssh-agent。+1给你!
卡斯卡贝尔

我是否需要使用ssh-keygen或ssh-add感到困惑。在我的〜/ .ssh /目录中,只有两个文件:config和known_hosts。似乎ssh-add需要另一个文件〜/ .ssh / id_rsa。我是否应该首先使用ssh-keygen创建该文件,如@Jefromi解释的那样?
重新编程器

是的,您需要先创建密钥,然后才能将其复制到远程服务器。我想您可能对使用“密码短语”一词感到困惑,这就是ssh-*所谓的使用密钥所需的密码短语。
卡斯卡贝尔

是的,我应该说密码而不是密码。
重新编程器

23

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

在此处输入图片说明


23

如果您已使用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
您是一个救星,已经厌倦了每次输入用户名密码的麻烦。谢谢:)
Dave Ranjan '18

请指定这是仅适用于Linux还是仅适用于Windows或两者都适用。
joedotnot

@joedotnot对于所有操作系统。您也可以浏览提到的链接,然后在标题下方找到OS选项。
Nishant Thapliyal,

这个!在任何情况下都有效。
Akaisteph7

@Charles嗨,我已经测试了相同的功能,并且按预期工作。
Nishant Thapliyal

8

将Muein的思想延伸给那些喜欢直接在git-bash或终端中运行命令来编辑文件的人。

转到项目的.git目录(本地计算机上的项目根目录),然后打开“ config”文件。然后查找[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

1
这确实有帮助。安全且干净的方法来解决此问题。我认为有人应该用这个来改善Muein的答案。
Luis Ortega Araneda

1
第一次尝试“进入项目的.git目录”
未知2017年

得到这个错误“致命:我不处理协议'git@github.com:<用户名> / https'”
Shivam Bharadwaj

@ShivamBharadwaj的快速搜索显示了该线程stackoverflow.com/questions/30474447/…。您是否有可能从某个网站复制git clone命令并遇到此问题?如果是,则尝试键入完整命令。
uchamp

6

我认为这里有两件事。第一个是普通的SSH身份验证要求用户输入帐户密码(根据sshd配置,将使用不同的方法对帐户密码进行身份验证)。

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

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

具有公钥认证

如果要避免每次都输入证书的密码,则可以使用DigitalRoss指出的ssh-agent

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

从这里开始:man ssh-agent。

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

使用钥匙串,您可以执行与ssh-agent相同的操作,但可以执行“系统级”操作。打开计算机电源后,您将打开一个外壳并输入证书的密码。然后,所有其他外壳将使用该“已加载”证书,并且在您重新启动PC之前,不会再询问您的密码。

Gnome有一个类似的应用程序,称为Gnome Keyring,它在您第一次使用证书时要求您输入证书的密码,然后将其安全地存储起来,因此不会再被询问。


我自己使用钥匙串:非常有用。
2009年

通过编写AddKeysToAgent yes.ssh / config 还有另一种方法。然后将其加载到内存中,直到您关闭计算机为止
2008年


4
ssh-keygen -t rsa

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


4
请注意,如果执行此操作,那么有权访问您的开发客户端的任何人都可以访问存储库服务器而无需输入密码。ssh-agent / ssh-add组合提供了更好的安全性。
Peter V.Mørch'12年

3

在您推开的盒子里试试看

    ssh git@github.com

然后,您应该会收到来自github的欢迎响应,并且可以继续推送。


2
它对我Hi gkucmierz! You've successfully authenticated, but GitHub does not provide shell access.
有用,

2

我不得不从不允许登录vie ssh密钥但只能使用用户/密码的服务器上克隆git repo。我发现没有办法配置Git插件以使用简单的用户名/密码组合,因此我在Linux构建机器上添加了以下shell命令作为预构建步骤,具体取决于工具的期望(apt-get install Expect):

这不是解决此问题的好方法,因为您的密码在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'

1

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

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

解决方案的来源是/ubuntu/362280/enter-ssh-passphrase-once/853578#853578


0

我一直在尝试避免一直输入密码,因为我在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

因此,我每次在会话中输入我的密码。


-1

我尝试了所有这些建议以及更多建议,以便可以从我的AWS实例进行git clone。没事。我终于绝望地作弊:我将id_rsa.pub的内容复制到本地计算机上,并将其附加到我的AWS实例上的〜/ .ssh / known_hosts中。


1
您确定不表示〜/ .ssh / authorized_keys吗?
Kevin_Kinsey '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.