SSH密钥-仍要求输入密码和密码


494

克隆存储库时,我一直在与Github保持联系,总是询问我的用户名和密码。我想绕过此步骤,因为这是我工作流程中的一个烦恼。

我尝试使用此指南设置SSH密钥(成功完成)。https://help.github.com/articles/generating-ssh-keys,我成功了。

我的问题是,克隆存储库(使用SSH)时,仍然要求我提供github密码和密码。我的理解是,在设置了此SSH密钥后,我将不再需要这样做。

我有点不确定要问什么,所以我只说我的目标。

我希望能够克隆存储库而不必一直输入我的Github信息

我的SSH密钥缺少什么?如果有人可以提供一些指导或资源,我将不胜感激,因为在GitHub上进行SSH认证时,我总是感到有些困惑。

据我所知,这是一个测试事情是否正常运行的命令,这是控制台的输出:

~ $ ssh -T git@github.com
Saving password to keychain failed
Enter passphrase for key '/Users/MYNAME/.ssh/id_rsa':
Hi MYNAME! You've successfully authenticated, but GitHub does not provide shell access.

当我输入密码时,密码应该首先失败吗?然后,当我输入密码时,密码就会通过。


1
您在哪个操作系统上?现代的Linux桌面建议将您的密码存储在钥匙圈管理器中。与Mac OS X相同。在Windows中,您可以使用pageant,它是的一部分putty。在所有这些目标中,目标是相同的:启动PC后仅输入一次密码,密钥管理器代理将在以后的使用中将其传递给ssh,直到重新启动为止。
janos 2014年


2
我在这里参加聚会有点晚了,但是在github中的小克隆选项卡/按钮上,有一个链接显示“ Use SSH”。你想这样做。它将您的克隆链接更改为“ git @ github:username / project.git”。如果您将SSH密钥添加到github并使其在本地的ssh-agent上运行,那么您应该无需输入用户名或密码即可进行推送。
Logan Kitchen

Answers:


201

如果您使用HTTPs网址,它将始终询问您的用户名/密码。

如果您SSH在克隆/设置遥控器时使用正确。然后确保您有一个ssh-agent来记住您的密码。这样,您只需在终端会话中输入一次密码即可。

如果仍然很烦人,则只需设置不带密码的ssh-key即可。


2
感谢您的回应。我一直只使用HTTP。我正在尝试实现SSH身份验证,并认为我进行了设置。我需要安装ssh-agent超出git吗?谢谢
HelloWorld

1
@ R11G,您不能,否则密码将不安全...只需重新生成一个新密码即可。
西蒙·布德里亚斯

50
我只想指出,密码短语用于加密您的私钥,因此,如果您不使用密码短语,则您的私钥将在计算机上未加密。这就像在计算机上放置的文本文件中保留密码一样。

2
有趣的是,我的HTTPS存储库从不要求输入密码,而我的SSH存储库始终会要求输入密码。
亚当

33
请参阅此github文档以将远程URL从https转换为ssh。要检查远程URL是ssh还是https,请使用git remote -v。要从https切换到ssh,请执行以下操作:git remote set-url origin git@github.com:USERNAME/REPOSITORY.git
Manavalan Gajapathy'Apr

824

无需钥匙串即可添加身份

有时您可能不希望将密码短语存储在钥匙串中,但又不想一次又一次地输入密码短语。

您可以这样做:

ssh-add ~/.ssh/id_rsa 

这将要求您输入密码,然后输入密码,直到重新启动后才会再次询问。

使用钥匙串添加身份

正如@dennis在注释中指出的那样,要通过将密码短语存储在钥匙串中来保持密码短语在重启过程中的持久性,可以在添加身份时使用-K选项(-k对于Ubuntu):

ssh-add -K ~/.ssh/id_rsa

再一次,这将要求您输入密码,然后输入密码,这一次它将再也不需要此身份。


178
请注意,这不会在重新启动时保留身份。-K添加密码时,您可以使用该选项将密码存储在钥匙串中,例如ssh-add -K ~/.ssh/id_rsa
Dennis

29
-k对我来说是小写的...(Linux Mint / Ubuntu 14.04基础),但是可以!最终进行了排序...
Louis Maddox

8
只需运行命令“ ssh-add”并输入一次密码,命令行就不会再次提示您输入密码。
AVINASH SHRIMALI

14
您不需要任何参数;刚运行ssh-add将自动添加~/.ssh/id_rsa(以及其他文件)。并且没有理由将输出发送给/dev/null; 最好查看其执行情况报告。
泰德·霍普

6
我为什么会收到“无法打开与您的身份验证代理的连接”的主意吗?
dokaspar

251

在Mac OSX上,您可以使用以下命令将私钥添加到钥匙串:

ssh-add -K /path/to/private_key

如果您的私钥存储在〜/ .ssh中,并且名为id_rsa:

ssh-add -K ~/.ssh/id_rsa

然后将提示您输入密码,该密码将存储在钥匙串中。

编辑-处理重启

为了即使重新启动后也不必填写密码,请将以下内容添加到ssh配置文件中(通常位于〜/ .ssh / config中)

Host *
  UseKeychain yes
  AddKeysToAgent yes
  IdentityFile ~/.ssh/id_rsa

7
就我而言,重启后仍然会提示输入密码(macOS Sierrra 10.12.2)。关于如何解决这个问题的任何想法?
inigo333 '16

9
没关系,我刚刚发现了问题。这是Mac OS X 10.12中的一个错误(功能?),其中ssh-agent在启动过程中不会自动在钥匙串上加载密码。github.com/lionheart/openradar-mirror/issues/15361
inigo333 '16

2
@ inigo333有趣。我刚刚更新并注意到了这一点!
Groot

1
@ Groot,BTW,如其他答案中所建议,将“ Host * UseKeychain yes”添加到“〜/ .ssh / config”中,即可解决此问题。
inigo333 '18

1
这应该是公认的答案。特别是~/.ssh
Xavi

186

我在这里尝试了所有答案,但这些答案都无效!在Mac的会话/重新启动之间,我的密码无法保留。

通过阅读此OpenRadarTwitter讨论,我发现Apple故意更改了 macOS 10.12 Sierra中ssh-agent 的行为,使其不再自动加载以前的SSH密钥。为了保持与El Cap相同的行为,我做了以下事情:

  1. ssh-add -K ~/.ssh/id_rsa
    注意:将路径更改为id_rsa密钥所在的位置。
  2. ssh-add -A
  3. 创建(或编辑,如果存在)以下~/.ssh/config文件:

    Host *
      UseKeychain yes
      AddKeysToAgent yes
      IdentityFile ~/.ssh/id_rsa
    

现在,我的密码在我的Mac重新启动之间被记住了!


2
这可能对添加到githubosx文档页面很有用。很难确定我的Mac运行10.11和其他运行10.12的行为为何不同。
Grr

5
在OSX升级后发生在我身上,谢谢(我想ssh-add -A如果您只有一个键就不需要了~/.ssh/id_rsa
Dorian

1
这是一个非常有用的答案。谢谢,您过得很愉快。
纳纳什(Jan Nash)

2
截至2017年10月,如果您使用的是macOS 10.12或更高版本,此答案正是您所需要的。
brogrammer

3
这是现在在GitHub的文档:help.github.com/articles/...
托德价格

35

您可以删除密钥的密码短语

$ ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]

或者你可以跑

$ ssh-keygen -p

您会提示输入密钥文件。默认情况下,请~/.ssh/id_rsa按Enter

系统会提示您输入当前密码。

然后将提示您输入新密码,按Enter


这应该比将密码短语添加到钥匙串的许多几乎相同的答案要高。我必须将我的公钥提供给管理员,并且包含一个密码短语,每次输入时都会变得烦人。如果您对计算机没有太多控制权(-K,对我不起作用)-k,这是一个干净的解决方案-A
gwg

1
这是唯一在重启后对我有用的东西,所有ssh-add -K,-k等命令都没有为我做任何事情。
Amalgovinus

28

只需运行以下命令:

ssh-add -K

它永远不会要求您再次输入密码。


3
这很好用,但是我有点担心运行随机命令。但是,如果您检查文档ssh-add仅是“将私钥身份添加到身份验证代理”,并且该-K选项只是使其做到“在添加身份时,每个密码短语也将存储在用户的钥匙串中”。
machineghost

8
实际上,它只能修复它,直到我重新启动为止:(
machineghost

5
在Windows的bash shell中,“-k”标志必须为小写。仅供参考
-Fergus

27

确保您还将ssh用于存储库

mahtab@mahtab-Lenovo-G50-70:~/my-projects/jenkins-cje-2017$ git remote -v origin git@github.com:eMahtab/jenkins-cje-2017.git (fetch) origin git@github.com:eMahtab/jenkins-cje-2017.git (push)

在此处输入图片说明

不要使用https,如果您的遥控器使用https,那么即使您已将公共密钥添加到Github并将私钥添加到ssh-agent,它也会继续询问密码。下面总是会要求输入密码

mahtab@mahtab-Lenovo-G50-70:~/my-projects/jenkins-cje-2017$ git remote -v origin https://github.com/eMahtab/jenkins-cje-2017.git (fetch) origin https://github.com/eMahtab/jenkins-cje-2017.git (push)


是的,区分两种远程URL类型对我很有帮助。这在git pull和方面帮助了我git push。我将网址从HTTPS类型切换为SSH类型,并且有效- git pull不再要求输入密码。
Michael R

1
可以使用以下命令进行切换:git remote set-url origin git@github.com:USERNAME/REPOSITORY.git
guido

17

我必须执行:

eval `ssh-agent -s`
ssh-add

注意:每次重新启动后,您都必须再次执行此操作。如果要避免这种情况,请在Windows 中的“ .bashrc ”文件中输入它C:\Users\<<USERNAME>>\.bashrc。它可能是隐藏的,因此请确保您可以看到隐藏的文件。

解决方案在这里找到。


15

如果您使用的是Windows,这对我有用:

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

它会在第二个命令中要求输入密码,仅此而已。


1
注销并重新登录时,每次都必须重新输入密码。
trainoasis


11

您需要使用ssh代理。
TL; DR:打开终端并尝试

ssh-add

在推之前。出现提示时输入密码。

在这里查看原始StackExchange答案


6

我最近升级到了macOS Mojave,并通过自制软件安装了一些工具,这似乎可以将Apple的版本替换ssh-add为其他版本。我的默认版本ssh-add 没有-K选项。这导致以下错误:

# ssh-add: illegal option -- K

您可以ssh-add通过运行查看自己的版本which ssh-add

(我的矿藏在/usr/local/bin/ssh-add

要解决此问题,我必须将密钥指向Apple的版本

/usr/bin/ssh-add -K ~/.ssh/id_rsa

之后,Git / GitHub完美运行。有关更多信息,请参见:错误:ssh-add:非法选项-K


在具有High Sierra 10.13.6的iMac上遇到了相同的问题-这对我有用。谢谢!
emccracken

我的工作一直很好,并且随机开始再次询问密码-可能是在最近更新之后。这样解决了!谢谢
mc01

5

对于Mac OSX Sierra,我发现github问题中为Open Radar建议的修复程序解决了我的问题。似乎Sierra更改了默认行为(升级后我开始遇到此问题)。

我发现这一点特别有用:https : //github.com/lionheart/openradar-mirror/issues/15361#issuecomment-249059061

ssh-add -A 

我跑完之后,这导致我的身份被添加到代理中

ssh-add -K {/path/to/key}

总结一下,在OSX.12中:

ssh-add -K {/path/to/key}
ssh-add -A 

应导致:

Identity added: {/path/to/file} ({/path/to/file})

编辑:我注意到下一次我进行完全重新启动(又名代理停止并重新启动)时,此操作不再起作用。更完整的解决方案是上述@ChrisJF:创建~/.ssh/config文件。这是我的输出:

$ cat ~/.ssh/config
Host *
  UseKeychain yes
  AddKeysToAgent yes
  IdentityFile ~/.ssh/id_rsa

您可以根据IdentityFile需要添加任意多个条目,但这是默认设置。这也是ATM上面openradar链接上的“趋势”答案。


编辑的一本书解决了我的问题。MacOS Mojave 10.14.3
Jose

4

LinuxMint / Ubuntu中工作

执行以下步骤

步骤1:

转到文件=> /.ssh/config

将以下行保存到文件中

Host bitbucket.org
    HostName bitbucket.org
    User git
    IdentityFile /home/apple/myssh-privatekey
    AddKeysToAgent yes

不要忘记添加这一行AddKeysToAgent是

第2步:

打开终端并将密钥集添加到ssh-add

$ ssh-add -k /home/apple/myssh-privatekey

提供密码。



3

这对我有用:

git config --global core.sshCommand "'C:\Windows\System32\OpenSSH\ssh.exe'"

2

问题似乎是因为您是从HTTPS而不是SSH进行克隆。我在这里尝试了所有其他解决方案,但仍然遇到问题。这为我做到了。

这样使用osxkeychain helper

  1. 了解是否已安装。

    git credential-osxkeychain

  2. 如果尚未安装,将提示您将其作为Xcode命令行工具的一部分进行下载。

  3. 如果已安装,请告诉Git使用osxkeychain helper全局credential.helper配置来使用:

    git config --global credential.helper osxkeychain

下次克隆HTTPS URL时,将提示您输入用户名/密码,并授予对OSX钥匙串的访问权限。第一次执行此操作后,应将其保存在钥匙串中,而无需再次键入。


2

这个答案主要针对Windows用户,如果在其他任何操作系统上使用tfs,github或gitlab克隆时遇到问题,也同样适用。

使用SSH时的默认身份验证模式是私钥。每当由于某种原因而失败时,ssh-agent都会退回到基于用户名和密码的身份验证。

基于默认密钥的身份验证可能失败的原因有很多。以下是最常见的情况:

a)ssh-agent 无法找到默认的私钥文件id_rsa,并且未明确指定其他密钥路径。

b)存储在服务器中的公钥不正确。

c)您尝试克隆的路径不正确。

无论如何,要解决此问题,首先要执行git clone命令,并使用以下命令进行详细记录:

GIT_TRACE=1 GIT_SSH_COMMAND="ssh -vvv" git clone ssh://pathToYourRepo

您可以遍历日志中的每个步骤,以直观了解问题的根源。


(a)情况下的故障排除

  • 确保您在.ssh目录中具有默认的密钥名称id_rsa。使用ssh-keygen命令生成密钥时,您可能指定了一些不同的密钥名,或者根本没有任何密钥)。
  • 如果要为身份验证指定其他密钥,请使用以下命令:

    ssh-agent bash -c 'ssh-add ~/.ssh/anotherKey; git clone ssh://pathToYourRepo'
    

(b)情况下的故障排除

  • 将公钥存储在服务器中时,请确保没有多余的空格。

(c)情况下的故障排除

  • 确保您不尝试使用存储库路径的https版本进行克隆。

1

如果您将ssh url用作git,则在提示您输入ssh的密码时,将用户名设为“ git ”,并将密码作为系统的登录密码。


将存储库远程URL类型从更改HTTPSSSH可解决我的问题。谢谢@MichaelR,您的文章确实很有帮助,尽管我什么都没读:D
Geradlus_RU

1

我想为可能仍需要输入密码的用户添加答案,因为他们将IdentitiesOnly设置为yes。这可能是由于多个密钥和身份文件(是git或服务器的密钥)引起的。

在生成密钥并将其复制到服务器后:

ssh-keygen
ssh-copy-id -i ~/.ssh/12gpu_server.pub lerner@192.168.20.160

我发现它没有用。

然后我去检查~/.ssh/config文件,在底部看到了这个:

Host *
IdentitiesOnly yes

然后在上面添加:

Host 12gpu
HostName 192.168.20.160
User lerner
IdentityFile ~/.ssh/12gpu_server

我可以输入来登录ssh 12gpu

然后,您可以使用自己喜欢的名称添加多个ssh密钥,只需要将上述四行之类的设置添加到配置文件中。

主机是您稍后连接服务器时要输入的名称;该主机名是服务器的IP地址或域名就像github.com; 用户是您登录服务器的用户名,例如github或gitlab的用户名或git;而IdentityFile是存储已生成的密钥的文件。


1

通常,以下是允许您使用不带密码的ssh远程连接到服务器的步骤:

  • 创建一对rsa私钥和公钥

    $ ssh-keygen -t rsa -b 4096 -C "your comments"
    
  • 复制您的公钥并登录到远程服务器

  • 将您的公钥添加到.ssh / authorized_keys

  • 如果您的计算机中有多个ssh密钥,则可以使用ssh-add添加密钥

    $ ssh-add /path/to/private/key

  • 然后尝试SSH到您的服务器

    $ ssh username@your_ip_address

资料来源:http : //diary-of-programmer.blogspot.com/2018/08/tips-how-to-ssh-to-your-digitalocean.html



0

如果您使用的Windows和GIT没有第三方工具,并且您的密钥不受密码/密码保护,请使用以下命令:

  1. 环境变量HOME必须设置为您的用户配置文件(例如C:\ Users \ Laptop)
  2. 转到C:\ Users \ Laptop \ .ssh \文件夹并编辑“ config”文件 (或创建该文件!)示例:C:\ Users \ Laptop.ssh \ config(注意:结尾没有。)
  3. 将您的git-server主机添加到“ config”文件中,如下所示:

    #Example host entry
    Host myhostname.com
        HostName myhostname.com
        User git
        IdentityFile c:/users/laptop/.ssh/id_rsa.pub
        PasswordAuthentication no
        Port 422
    
  4. 保存文件并克隆存储库,如下所示:

    git clone ssh://myhostname.com/git-server/repos/picalc.git

您可以将其他配置参数用于“ config”文件主机条目。这些可以在本地git安装文件夹中找到,例如“ C:\ Program Files \ Git \ etc \ ssh \ ssh_config ”。摘抄:

# Host *
#   ForwardAgent no
#   ForwardX11 no
#   RhostsRSAAuthentication no
#   RSAAuthentication yes
#   PasswordAuthentication yes
#   HostbasedAuthentication no
#   GSSAPIAuthentication no
#   GSSAPIDelegateCredentials no
#   BatchMode no
#   CheckHostIP yes
#   AddressFamily any
#   ConnectTimeout 0
#   StrictHostKeyChecking ask
#   IdentityFile ~/.ssh/identity
#   IdentityFile ~/.ssh/id_rsa
#   IdentityFile ~/.ssh/id_dsa
#   IdentityFile ~/.ssh/id_ecdsa
#   IdentityFile ~/.ssh/id_ed25519
#   Port 22
#   Protocol 2
#   Cipher 3des
#   Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc
#   MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160
#   EscapeChar ~
#   Tunnel no
#   TunnelDevice any:any
#   PermitLocalCommand no
#   VisualHostKey no
#   ProxyCommand ssh -q -W %h:%p gateway.example.com
#   RekeyLimit 1G 1h

0

对我来说同样的问题,解决方案是:

请参阅此github文档以将远程URL从https转换为ssh。要检查remote的URL是ssh还是https,请使用git remote -v。要从https切换到ssh,请执行以下操作:git remote set-url origin git@github.com:USERNAME / REPOSITORY.git @jeeYem



0

SSH密钥-仍要求输入密码和密码

如果在Windows上并且使用PuTTY作为SSH密钥生成器,则使用简单的Windows命令行,对于我而言,此快速简便的解决方案是唯一可行的解​​决方案:

  1. PuTTY安装中应包含多个可执行文件,pageant.exe以及plink.exe
  2. 使用PuttyGen生成SSH密钥时,密钥与.ppk扩展名一起存储
  3. 运行"full\path\to\your\pageant.exe" "full\path\to\your\key.ppk"必须加引号)。这将执行pageant服务并注册您的密钥(输入密码后)。
  4. 设置环境变量GIT_SSH=full\path\to\plink.exe不能带引号)。这会将git ssh-communication-related命令重定向到plink将使用该pageant服务进行身份验证的命令,而无需再次询问密码。

做完了!

注意1: 本文档警告使用GIT_SHH环境变量设置时的某些特殊性。我可以pushpullfetch任意数量的附加参数的命令和一切对我的作品就好了(而无需编写额外的脚本,其中建议)。

注意2:PuTTY通常是安装路径,PATH因此可以省略。无论如何,我更喜欢指定完整路径。

自动化:

在从命令行使用git之前,可以运行以下批处理文件。它说明了设置的用法:

git-init.bat
   @ECHO OFF
   :: Use start since the call is blocking
   START "%ProgramFiles%\PuTTY\pageant.exe" "%HOMEDRIVE%%HOMEPATH%\.ssh\id_ed00000.ppk"
   SET GIT_SSH=%ProgramFiles%\PuTTY\plink.exe

无论如何,我都GIT_SSH设置了变量SystemPropertiesAdvanced.exe > Environment variables并将其pageant.exe添加为Run注册表项(*)。

(*)添加Run注册表项的步骤>

  1. regedit.exe
  2. 导航 HKEY_CURRENT_USER > Software > Microsoft > Windows > CurrentVersion > Run
  3. 做(菜单) Edit > New > String Value
  4. 输入一个任意(但唯一)的名称
  5. 做(菜单)Edit > Modify...(或双击)
  6. 输入到pageant.exe和的引号引起的路径public key,例如,"C:\Program Files\PuTTY\pageant.exe" "C:\Users\username\.ssh\id_ed00000.ppk"(请注意,%ProgramFiles%除非在步骤3中选择Expandable string value,否则etc.变量在此处不起作用String value)。


-1

我认为@sudo bangbang的答案应该可以接受。

生成ssh密钥时,当提示您配置密码时,您只需按“ Enter”以跳过键入密码。

这意味着您在使用ssh密钥时不需要密码,因此请记住在生成ssh密钥时,请勿输入密码,只需按“ Enter”以将其跳过。


1
这是一个非常糟糕的建议。参见@ user456814的评论
索斯(Sos)
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.