当我克隆存储库时,我一直在某种程度上“忍受”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.
当我输入密码时,应该先失败吗?然后,当我输入密码时,它就通过了。
pageant
,它是 putty
的一部分。在所有这些中,目标都是相同的:您在启动 PC 后只输入一次密码,密钥管理器代理将在后续使用中将其传递给 ssh,直到您重新启动。
添加没有钥匙串的身份
有时您可能不希望密码短语存储在钥匙串中,但又不想一遍又一遍地输入密码短语。
你可以这样做:
ssh-add ~/.ssh/id_rsa
这将要求您输入密码,输入它,直到您重新启动它才会再次询问。
使用钥匙串添加身份
正如@dennis 在评论中指出的那样,要通过将密码存储在您的钥匙串中来通过重启来保持密码,您可以在添加这样的身份时使用 --apple-use-keychain
选项(对于 Ubuntu 是 -k
):
ssh-add --apple-use-keychain ~/.ssh/id_rsa
再一次,这会要求你输入密码,输入它,这一次它不会再要求这个身份。
如果您使用 HTTPs
网址,它总是会询问您的用户名/密码。
如果您在克隆/设置遥控器时正确使用了 SSH
。然后确保你有一个 ssh-agent 来记住你的密码。这样,您只需通过终端会话输入一次密码。
如果它仍然太烦人,那么只需设置一个不带密码的 ssh-key。
git remote -v
。从 https 切换到 ssh:git remote set-url origin git@github.com:USERNAME/REPOSITORY.git
在 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
~/.ssh
中的配置文件
ssh-add -K ~/.ssh/id_rsa
解决了这个问题
我在这里尝试了所有答案,但这些答案都没有奏效!我的密码在我的 Mac 的会话/重新启动之间不会保留。
我从阅读 this OpenRadar 和 this Twitter discussion 中发现,macOS 10.12 Sierra 中 ssh-agent 的 Apple purposely changed the behaviour 不再自动加载以前的 SSH 密钥。为了保持与 El Cap 相同的行为,我执行了以下操作:
ssh-add -K ~/.ssh/id_rsa 注意:将路径更改为 id_rsa 密钥所在的位置。 ssh-add -A 创建(或编辑,如果存在)以下 ~/.ssh/config 文件: Host * UseKeychain 是 AddKeysToAgent 是 IdentityFile ~/.ssh/id_rsa
现在我的密码在我的 Mac 重新启动之间被记住了!
~/.ssh/id_rsa
只有一个键,我认为不需要 ssh-add -A
)
TL;DR 您需要使用 ssh 代理。为此,请打开终端并在推送到 git 之前,执行 ssh-add 在出现提示时输入您的密码。
查看原始 StackExchange 答案 here
您可以删除密钥的密码
$ ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
或者你可以运行
$ ssh-keygen -p
您会收到输入密钥文件的提示。默认情况下它 ~/.ssh/id_rsa
所以按回车
系统会提示您输入当前密码短语。
然后会提示输入新密码,按回车
-K
、-k
、-A
对我不起作用)。
ssh-keygen -p -P MyOldPassPhrase -N "" -f ~/.ssh/mykeyfile
。谢谢!
确保您也将 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://i.stack.imgur.com/LVnVW.png
不要使用 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)
git pull
和 git push
方面帮助了我。我将我的 url 从 HTTPS 类型切换到 SSH 类型,并且它起作用了——git pull
停止询问密码。
git remote set-url origin git@github.com:USERNAME/REPOSITORY.git
只需运行以下命令:
ssh-add -K
它永远不会要求您再次输入密码。
ssh-add
只是“将私钥身份添加到身份验证代理”,而 -K
选项只是使“添加身份时,每个密码短语也将存储在用户的钥匙串中”。
我不得不执行:
eval `ssh-agent -s`
ssh-add
注意:每次重新启动后,您都必须再次执行此操作。如果您想避免它,请将其输入到 Windows 上 C:\Users\<<USERNAME>>\.bashrc
中的“.bashrc”文件中。它可能是隐藏的,因此请确保您可以看到隐藏的文件。
找到解决方案 here。
如果您使用的是 Windows,这对我有用:
eval `ssh-agent -s`
ssh-add ~/.ssh/*_rsa
它会在第二个命令中要求输入密码,就是这样。
将这些行添加到您的 bash 配置文件 $HOME/.bash_profile
或 $HOME/.bashrc
。
这个page on 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)
就这样。它现在可以工作了。
使用 ssh-add 命令将您的公钥添加到 ssh-agent。
ssh-add
确保 ssh 公钥,例如 ~/.ssh/id_rsa.pub 是您在 repo 设置中的内容。
确保您实际上可以通过 ssh 进入服务器,例如对于 Bitbucket:
ssh -T git@bitbucket.org
更新 url 以从 https 移动到 ssh。您可以通过检查以下输出来检查您使用的内容:
git remote -v
如果您在 url 中看到 https://,那么您仍在使用 https。要更新它:获取 url 并将 https:// 替换为 ssh:// 例如更改:
https://git@bitbucket.org/../..
至:
ssh://git@bitbucket.org/../..
这对我有用:
git config --global core.sshCommand "'C:\Windows\System32\OpenSSH\ssh.exe'"
对于 Mac OSX Sierra,我发现 Open Radar 的 github 问题中建议的修复解决了我的问题。似乎 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
条目,但这是默认设置。这也是上面 openradar 链接 ATM 上的“趋势”答案。
在 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
提供密码。
我最近升级到 macOS Mojave,并通过自制软件安装了一些工具,这似乎将 Apple 的 ssh-add
版本换成了不同的版本。我的默认版本的 ssh-add
没有有 -K
选项。这导致了以下错误:
# ssh-add: illegal option -- K
您可以通过运行 which 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
此答案主要针对 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 版本进行克隆。
如果您之前为您的 GIT 使用密码认证,但现在使用 SSH 认证,您需要switch remote URLs from HTTPS to SSH:
git remote set-url origin git@github.com:USERNAME/REPOSITORY.git
我已经设置了密码,但由于某种原因它不再识别它了。所以我只是使用 ssh-add -K
再次将身份文件添加到我的钥匙串中,它不再询问我的密码。
添加到上述答案。必须在 Windows 上再做一步才能使 git 能够使用 ssh-agent。
必须在 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) 中找到。
问题似乎是因为您是从 HTTPS 而不是 SSH 克隆的。我在这里尝试了所有其他解决方案,但仍然遇到问题。这为我做到了。
像这样使用 osxkeychain helper
:
看看你是否安装了它。 git credential-osxkeychain 如果未安装,系统会提示您将其作为 Xcode 命令行工具的一部分下载。如果已安装,请使用全局 credential.helper 配置告诉 Git 使用 osxkeychain 助手: git config --global credential.helper osxkeychain
下次克隆 HTTPS url 时,系统会提示您输入用户名/密码,并授予对 OSX 钥匙串的访问权限。第一次执行此操作后,它应该保存在您的钥匙串中,您无需再次输入。
通常,以下是允许您使用 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
SSH Key - Still asking for password and passphrase
如果在 Windows 上并使用 PuTTY 作为 SSH 密钥生成器,此快速 &使用简单的 Windows 命令行,简单的解决方案对我来说是唯一可行的解决方案:
您的 PuTTY 安装应该附带几个可执行文件,其中包括 pageant.exe 和 plink.exe 当使用 PuttyGen 生成 SSH 密钥时,密钥以 .ppk 扩展名存储 运行 "full\path\to\your\pageant.exe" “full\path\to\your\key.ppk”(必须引用)。这将执行选美服务并注册您的密钥(输入密码后)。设置环境变量 GIT_SSH=full\path\to\plink.exe (不得引用)。这会将与 git ssh-communication 相关的命令重定向到 plink,plink 将使用 pageantservice 进行身份验证,而无需再次询问密码。
完毕!
注意 1: This documentation 在使用 GIT_SHH
环境变量设置时会发出一些特殊警告。我可以在命令中使用任意数量的附加参数 push
、pull
、fetch
,一切对我来说都很好(无需按照其中的建议编写额外的脚本)。
注意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 > Environment variables
中设置了 GIT_SSH
变量,并将 pageant.exe
添加为 Run
注册表项 (*)。
(*) 添加 Run
注册表项的步骤>
运行 regedit.exe 导航到 HKEY_CURRENT_USER > Software > Microsoft > Windows > CurrentVersion > Run Do (menu) Edit > New > String Value 输入任意(但唯一的)名称 Do (menu) Edit > Modify...(或双击) 输入 pageant.exe 和公钥的引号括起来的路径,例如 "C:\Program Files\PuTTY\pageant.exe" "C:\Users\username\.ssh\id_ed00000.ppk"(注意 %ProgramFiles % 等变量在此处不起作用,除非在步骤 3 中选择可扩展字符串值代替字符串值。)。
如果您为 git 使用 ssh url,当提示输入 ssh 密码时,请将用户名设置为“git”,密码作为系统的登录密码
HTTPS
更改为 SSH
解决了我的问题。谢谢@MichaelR,你的文章真的很有帮助,虽然我还没有读到任何东西:D
使用 Github 提供的 ssh
远程 URL 而不是 https
。
我想为那些可能仍需要输入密码的人添加一个答案,因为他们已将 IdentitiesOnly 设置为是。这可能是由多个密钥和身份文件引起的,它们是 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 密钥了,你只需要像上面四行这样的设置添加到 config 文件中。
Host 是您稍后连接到服务器时要输入的名称; HostName 是服务器的 ip 或域,如 github.com; user 是你登录服务器的用户名,如 github 或 gitlab 的用户名或 git; IdentityFile 是您存储生成的密钥的文件。
如果您在没有第三方工具的情况下使用 Windows 和 GIT,并且您的密钥不受密码/密码短语的保护,请使用以下命令:
环境变量 HOME 必须设置为您的用户配置文件(例如 C:\Users\Laptop) 转到 C:\Users\Laptop\.ssh\ 文件夹并编辑“config”文件(或创建文件!)示例:C:\ Users\Laptop.ssh\config (注意:最后没有 . !)将您的 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 保存文件并克隆存储库,如下所示: 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
对我来说同样的问题,解决方案是:
请参阅此 github 文档以将远程 URL 从 https 转换为 ssh。要检查远程的 URL 是 ssh 还是 https,请使用 git remote -v。从 https 切换到 ssh: git remote set-url origin git@github.com:USERNAME/REPOSITORY.git @jeeYem
Mobaxterme 有一个 UI 界面
setting > configuration > SSH > SSH Agent > [check] Use internal SSH agent "moboAgent" > add [your id_rsa and restart mobaxterme to set changes]
-K
选项将密码存储在钥匙串中,例如ssh-add -K ~/.ssh/id_rsa
-k
对我来说......(Linux Mint / Ubuntu 14.04 base)但是是的!终于把这个整理好了……ssh-add
将自动添加~/.ssh/id_rsa
(在其他文件中)。并且没有理由将输出发送到/dev/null
;更好地看到它做了什么的报告。