通过SSH配置Git以登录一次

rep*_*mer 188 git ssh ssh-keys

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

小智 280

与GitHub有类似的问题,因为我使用的是HTTPS协议.要检查您正在使用的协议,请运行

git config -l
Run Code Online (Sandbox Code Playgroud)

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

git config remote.origin.url git@github.com:your_username/your_project.git
Run Code Online (Sandbox Code Playgroud)

  • 当repo是私有的并且您不是所有者时,这不起作用.我刚刚遇到了"Permission denied"错误. (14认同)
  • 我认为这应该是正式答案,^ 5 @Muein! (12认同)
  • 这只是一个回购,我怎样才能全球化? (7认同)
  • @ogzd GitHub(或您正在使用的任何服务)需要您的公共SSH密钥才能起作用,但这仍然是正确的解决方案。 (2认同)
  • 没有权限.解决方案不起作用. (2认同)
  • 另一种选择是 `git remote set-url origin git@github.com:your_username/your_project.git` (2认同)

Dig*_*oss 100

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

(好的,回应更新的问题,你首先运行ssh-keygen生成一个公钥和私钥,如Jefromi所 解释的.你把公钥放在服务器上.你应该使用密码,如果你没有,你有相同的平原- 私钥中的文字密码.但是当你这样做时,你需要作为一个实际问题ssh-agent,如下所述.)

您希望ssh-agent在登录时在后台运行.登录后,想法是只运行ssh-add一次,以便为代理提供密码,以解码密钥.然后代理只是在你的钥匙解锁和加载的情况下坐在内存中,每次你在某个地方ssh时都可以使用.

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

在OSX(错误,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
}
Run Code Online (Sandbox Code Playgroud)

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


1.甚至本地和偏远sudo的正确的pam扩展.

  • 与从 `ssh-agent` 获取输出相比,使用它可能更简洁: ```eval `ssh-agent` ``` (2认同)

Cas*_*bel 23

这是关于配置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
Run Code Online (Sandbox Code Playgroud)

编辑:你应该只是阅读DigitalRoss的答案,但是:如果你使用带密码的密钥,你需要使用它ssh-add <key-file>来添加它们ssh-agent(ssh-agent如果你的发行版还没有为你运行的话,那么显然会启动它).

  • 我不确定这是否能回答问题,他一定已经这样做了,否则他将无法访问该站点。他需要的答案是:“ssh-agent”,因为他想绕过每次输入密码的问题。不是投反对票,但我认为你需要改进这个答案,除非我是那个误解...... (2认同)
  • @DigitalRoss:啊,我不确定 OP 是否真的设置了密钥。不过你可能是对的,我故意建议不要使用密码。但是,您对“ssh-agent”当然是对的。+1给你! (2认同)

Zor*_*ayr 22

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

在此输入图像描述


Nis*_*yal 14

如果您使用HTTPS克隆(推荐),那么: -

git config --global credential.helper cache
Run Code Online (Sandbox Code Playgroud)

然后

git config --global credential.helper 'cache --timeout=2592000'
Run Code Online (Sandbox Code Playgroud)
  • timeout = 2592000(30天以秒为单位)启用缓存30天(或任何套件).

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

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

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

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

注意:您需要Git 1.7.10或更高版本才能使用凭据帮助程序.在系统重启时,我们可能需要再次输入密码.


uch*_*amp 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
Run Code Online (Sandbox Code Playgroud)

  • 这真的很有帮助。解决问题的安全和干净的方法。我认为应该有人用这个来改进 Muein 的答案。 (2认同)
  • 第一次尝试“转到项目的 .git 目录” (2认同)

Gas*_*ton 6

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

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

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

使用公钥认证.

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

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

从这里开始:man ssh-agent.

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

使用钥匙串,您可以执行与ssh-agent相同的操作,但"系统范围内".打开计算机后,打开shell并输入证书的密码.然后,每个其他shell将使用该"加载"证书,并且在重新启动PC之前永远不会再次询问您的密码.

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