当我克隆一个存储库时,我一直有点“忍受”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.
当我输入密码时,应该先失败吗?然后,当我输入密码时,它就通过了。
如果你使用HTTPs url,它总是会询问你的用户名/密码。这个问题可以用@Manavalan Gajapathy的评论来解决(复制这里):
看这个github文档转换远程的URL从https到ssh。要检查remote的URL是ssh还是https,请使用git remote -v。从https切换到ssh:
git remote set-url origin git@github.com:USERNAME/REPOSITORY.git
如果您在克隆/设置远程时正确使用SSH:请确保您有一个SSH -agent来记住您的密码(参见@Komu的回答)。这样,每个终端会话只需要输入一次密码。
如果它仍然太烦人,那么简单地设置一个ssh-key没有密码短语。
在Mac OSX上,您可以使用以下命令将您的私钥添加到keychain:
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
对于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。
我想为那些可能还需要进入的人补充一个答案
密码,因为他们已经设置
身份仅为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密钥
只需要在配置中添加上述四行设置即可
文件。
Host是连接到服务器时要输入的名称
晚;主机名是服务器的ip或域名,如github.com;“User”为登录的用户名
在服务器端,比如用户名或git for github或gitlab;而IdentityFile是存储
生成的密钥。
如果您使用的Windows和GIT没有第三方工具,并且您的密钥没有密码/密码短语保护,请使用以下方法:
Environment Variable HOME must be set to your user profile (e.g. C:\Users\Laptop)
Go to C:\Users\Laptop\.ssh\ folder and edit "config" file (or create the file!) Example: C:\Users\Laptop.ssh\config (note: there is no . at the end!)
Add your git-server host to the "config" file like so:
#Example host entry
Host myhostname.com
HostName myhostname.com
User git
IdentityFile c:/users/laptop/.ssh/id_rsa.pub
PasswordAuthentication no
Port 422
Save the file and clone the repository like this:
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
我最近升级到macOS Mojave,并通过homebrew安装了一些工具,这似乎是把苹果版本的ssh-add换成了另一个版本。我默认版本的ssh-add没有-K选项。这导致了以下错误:
# ssh-add:非法选项——K
您可以通过运行哪个ssh-add来查看您使用的是哪个版本的ssh-add。
(我的存储在/usr/local/bin/ssh-add)
为了解决这个问题,我必须指向苹果的版本:
/usr/bin/ssh-add -K ~/.ssh/id_rsa
Git/GitHub之后运行得很好。有关更多信息,请参见:Error: ssh-add: illegal option——K
SSH密钥-仍然要求密码和密码短语
如果在Windows上使用PuTTY作为SSH密钥生成器,这个快速而简单的解决方案是我使用普通Windows命令行的唯一工作解决方案:
Your PuTTY installation should come with several executable, among others, pageant.exe and plink.exe
When generating a SSH key with PuttyGen, the key is stored with the .ppk extension
Run "full\path\to\your\pageant.exe" "full\path\to\your\key.ppk" (must be quoted). This will execute the pageant service and register your key (after entering the password).
Set environment variable GIT_SSH=full\path\to\plink.exe (must not be quoted). This will redirect git ssh-communication-related commands to plink that will use the pageantservice for authentication without asking for the password again.
完成了!
注1:本文档警告使用GIT_SHH环境变量设置时的一些特殊情况。我可以用任意数量的附加参数对命令进行推、拉、取,一切都很好地为我工作(不需要像其中建议的那样编写额外的脚本)。
注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
无论如何,我已经在SystemPropertiesAdvanced.exe >中设置了GIT_SSH变量,并将pageant.exe添加为运行注册表键(*)。
(*)添加“运行注册表项>”步骤
run regedit.exe
Navigate to HKEY_CURRENT_USER > Software > Microsoft > Windows > CurrentVersion > Run
Do (menu) Edit > New > String Value
Enter an arbitrary (but unique) name
Do (menu) Edit > Modify... (or double-click)
Enter the quotes-enclosed path to pageant.exe and public key, e.g., "C:\Program Files\PuTTY\pageant.exe" "C:\Users\username\.ssh\id_ed00000.ppk" (notice that %ProgramFiles% etc. variables do not work in here unless choosing Expandable string value in place of the String value in step 3.).
这个答案主要是为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克隆ssh://pathToYourRepo
(b)情况下的故障排除
确保在服务器中存储公钥时没有多余的空格。
(c)情况下的故障排除
确保您没有尝试使用存储库路径的https版本进行克隆。
使用ssh-add命令将公钥添加到ssh-agent。
ssh-add
确保ssh公钥,例如~/.ssh/id_rsa。Pub是你的回购设置。
确保你可以ssh到服务器,例如Bitbucket:
ssh -T git@bitbucket.org
更新url以从https移动到ssh。你可以通过检查输出来检查你所使用的:
git remote -v
如果你在url中看到https://,那么你仍然在使用https。要更新它:获取url并将https://替换为ssh:// e.g.。
变化:
https://git@bitbucket.org/../..
To:
ssh://git@bitbucket.org/../..
引用:
https://docs.github.com/en/github/using-git/changing-a-remotes-url#switching-remote-urls-from-https-to-ssh
加上上面的答案。
为了git能够使用ssh-agent,不得不在Windows上再做一步。
必须在powershell中执行以下命令来更新环境变量:
PS> [Environment]::SetEnvironmentVariable("GIT_SSH", "$((Get-Command ssh).Source)", [System.EnvironmentVariableTarget]::User)
重启VSCode, Powershell或任何你正在使用的终端来激活env变量。
完整的说明可以在这里(https://snowdrift.tech/cli/ssh/git/tutorials/2019/01/31/using-ssh-agent-git-windows.html)找到。
github上的这个页面有你需要的答案。你必须从https切换到ssh认证。
检查它是如何验证的,如下所示。
$ git remote -v
> origin https://github.com/USERNAME/REPOSITORY.git (fetch)
> origin https://github.com/USERNAME/REPOSITORY.git (push)
使用git remote set-url命令将远程服务器的URL从HTTPS更改为SSH。
$ git remote set-url origin git@github.com:USERNAME/REPOSITORY.git
再次使用
$ git remote -v
# Verify new remote URL
> origin git@github.com:USERNAME/REPOSITORY.git (fetch)
> origin git@github.com:USERNAME/REPOSITORY.git (push)
这是所有。它现在可以工作了。