我已经通过 ssh 克隆了我的 git 存储库。因此,每次我通过推或拉与源站大师通信时,我都必须重新输入我的密码。如何配置 git 以便我不需要多次输入密码?
14 回答
GitHub 也有类似问题,因为我使用的是 HTTPS 协议。要检查您使用的协议,只需运行
git config -l
并查看以 . 开头的行remote.origin.url
。切换协议
git config remote.origin.url git@github.com:your_username/your_project.git
试试看ssh-add
,你需要ssh-agent
运行并持有你的私钥
(好的,响应更新的问题,您首先运行ssh-keygen
生成一个公钥和私钥,正如Jefromi 解释的那样。您将公钥放在服务器上。您应该使用密码,如果您没有密码,则相当于普通密码-你的私钥中的文本密码。但是当你这样做时,你需要作为一个实际问题ssh-agent
,如下所述。)
您希望ssh-agent
在登录时在后台运行。登录后,我们的想法是运行ssh-add
一次且仅一次,以便为代理提供您的密码,以解码您的密钥。然后,代理就坐在内存中,您的密钥解锁并加载,每次您在某个地方 ssh 时都可以使用。
然后所有 ssh-family 命令1将咨询代理并自动能够使用您的私钥。
在 OSX (err, macOS )、GNOME 和 KDE 系统上,ssh-agent
通常会为您自动启动。我将详细介绍以防万一,像我一样,您也有 Cygwin 或其他 Windows 环境,而这肯定不适合您。
从这里开始:man ssh-agent
。
有多种方法可以自动运行代理。正如手册页所解释的,您可以运行它,使其成为所有登录会话其他进程的父进程。这样,它提供的环境变量将自动存在于您的所有 shell 中。当您(稍后)调用ssh-add
或ssh
两者都可以访问代理时,因为它们都具有带有魔术套接字路径名或其他内容的环境变量。
或者,您可以将代理作为普通子项运行,将环境设置保存在文件中,并在每个 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
,如果失败则启动代理。
sudo
1. 甚至使用正确的 pam 扩展名进行本地和远程操作。
如果您已使用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:
如果您收到此错误git: 'credential-cache' is not a git command. See 'get --help'
然后替换git config --global credential.helper 'cache --timeout=2592000'
和git config --global credential.helper 'store --file ~/.my-credentials'
更新#2:
如果您不断收到用户名和密码的提示并遇到此问题:
登录失败,使用 ctrl+c 取消基本凭证提示。
重新安装最新版本的 git对我有用。
更新#3:
作为掉电的一部分,密码身份验证被暂时禁用。请改用个人访问令牌。
- 生成 Github accessToken
- 取消设置现有的凭据缓存
git config --global --unset credential.helper
git config --global credential.helper 'store --file ~/.my-credentials'
- 任何会提示输入
username
&password
并输入 token 而不是 password 的git 命令。
这是关于配置 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-agent
显然启动一个)。ssh-agent
确保在克隆存储库时使用的是 SSH URL 而不是 HTTPS;在 repo 的克隆 URL 框中,在复制 URL 之前选择 SSH 协议。见下图:
为那些喜欢直接编辑文件而不是在 git-bash 或终端中运行命令的人扩展 Muein 的想法。
转到项目的 .git 目录(本地计算机上的项目根目录)并打开“配置”文件。然后查找 [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
我认为这里有两种不同的东西。第一个是正常的 SSH 身份验证需要用户输入帐户密码(其中帐户密码将针对不同的方法进行身份验证,具体取决于 sshd 配置)。
您可以避免使用证书输入该密码。使用证书,您仍然需要输入密码,但这一次是您的私钥的密码(与帐户密码无关)。
为此,您可以按照 steveth45 指出的说明进行操作:
使用公钥认证。
如果您想避免每次都输入证书的密码,那么您可以使用 ssh-agent,正如 DigitalRoss 所指出的那样
执行此操作的确切方式取决于 Unix 与 Windows,但本质上,您需要在登录时在后台运行 ssh-agent,然后在第一次登录时,运行 ssh-add 为代理提供您的密码。然后,所有 ssh-family 命令都会咨询代理并自动获取您的密码。
从这里开始:man ssh-agent。
ssh-agent 的唯一问题是,至少在 *nix 上,您必须将证书密码放在每个新外壳上。然后证书被“加载”,您可以使用它对 ssh 服务器进行身份验证,而无需输入任何类型的密码。但这是在那个特定的外壳上。
使用钥匙串,您可以做与 ssh-agent 相同的事情,但是是“系统范围的”。打开计算机后,您打开一个外壳并输入证书的密码。然后,所有其他 shell 都将使用该“加载”证书,并且在您重新启动 PC 之前永远不会再询问您的密码。
Gnome 有一个类似的应用程序,称为Gnome Keyring,它会在您第一次使用它时询问您的证书密码,然后它会安全地存储它,这样您就不会再被询问。
如果您使用的是 github,他们有一个非常好的教程,可以更清楚地解释它(至少对我而言)。
ssh-keygen -t rsa
当要求输入密码时,请将其留空,即,只需按 Enter。就如此容易!!
从你推的盒子里试试这个
ssh git@github.com
然后,您应该会收到来自 github 的欢迎回复,然后推送就可以了。
我不得不从不允许登录 vie ssh 密钥但只能使用用户/密码的服务器克隆一个 git repo。我发现无法将 Git 插件配置为使用简单的用户/密码组合,因此我在依赖于工具 expect(apt-get install expect)的 linux 构建机器上添加了以下 shell 命令作为预构建步骤:
这不是解决此问题的好方法,因为您的密码在 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'
我一直在努力避免输入密码,因为我在 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
所以有了这个,我在会话中输入我的密码一次..
AddKeysToAgent yes
在 .ssh/config 文件的顶部添加一行。当然 ssh-agent 必须事先运行。如果它没有运行(检查prep ssh-agent
),那么只需运行它eval $(ssh-agent)
现在,密钥已在系统范围内加载到内存中,您不必再次输入密码。
解决方案的来源是https://askubuntu.com/questions/362280/enter-ssh-passphrase-once/853578#853578
我尝试了所有这些建议以及更多,只是为了可以从我的 AWS 实例中进行 git clone。没有任何效果。我终于绝望地作弊了:我在本地机器上复制了 id_rsa.pub 的内容,并将其附加到我的 AWS 实例上的 ~/.ssh/known_hosts 中。