运行“git clone git@remote.git”时如何提供用户名和密码?
Posted
技术标签:
【中文标题】运行“git clone git@remote.git”时如何提供用户名和密码?【英文标题】:How do I provide a username and password when running "git clone git@remote.git"? 【发布时间】:2012-04-20 17:03:50 【问题描述】:我知道如何为这样的 HTTPS 请求提供用户名和密码:
git clone https://username:password@remote
但我想知道如何向遥控器提供用户名和密码,如下所示:
git clone git@remote.git
我试过这样:
git clone username:password@git@remote.git
git clone git@username:password@remote.git
git clone git@remote.git@username:password
但他们没有工作。
【问题讨论】:
你不能。 “@”之前的“git”已经是用户名。您从哪里获得存储库 URL (git@remote.get)?您从哪里得知必须提供不同的用户名和密码? 我的 repos URL 来自 heroku "git@heroku.com:zxy-helloworld.git"。我使用 emacs shell 来克隆和推送。如果 shell 要求输入密码,emacs 将挂起。这是 Windows 上 emacs 的一个已知问题:gnu.org/software/emacs/windows/… 如果用户名是电子邮件怎么办?你怎么打字? myemail@gmail.com@example.com? 见GitHub's instruction on how to create a token and that why it's better due to scoping and permissions @Honey 问题不是 GitHub 特定的。 【参考方案1】:根据 Michael Scharf 的评论:
您可以省略密码,这样它就不会记录在您的 Bash 历史文件中:
git clone https://username@github.com/username/repository.git
它会提示您输入密码。
或者,您可以使用:
git clone https://username:password@github.com/username/repository.git
这种方式在 GitHub 存储库中对我有用。
【讨论】:
不建议将密码放在 URL 中,因为此文件保存在 .git/config 上。不安全,最好用ssh key @MrDuk 没问题,转义它(作为 %40 iirc)。 您可以省略密码:git clone https://username@github.com/username/repository.git
。 git 会询问您,它不会保存在 .git/config 或您的 bash 历史记录中
你也可以在行首输入'空格',这样linux就不会在历史记录中存储命令了
我喜欢的另一个选项是使用身份验证令牌而不是用户名来通过任何提示git clone https://<token>@github.com/username/repository.git
【参考方案2】:
user@host:path/to/repo
格式告诉 Git 使用 ssh 使用用户名 user
登录到 host
。来自git help clone
:
另一种类似 scp 的语法也可以与 ssh 协议一起使用:
[user@]host.xz:path/to/repo.git/
@
之前的部分是用户名,认证方式(密码、公钥等)由ssh决定,而不是Git。 Git 无法将密码传递给 ssh,因为 ssh 甚至可能不使用密码,具体取决于远程服务器的配置。
使用ssh-agent
避免一直输入密码
如果你不想一直输入你的ssh密码,典型的解决方案是generate a public/private key pair,把你的公钥放在远程服务器上的~/.ssh/authorized_keys
file,然后把你的私钥加载到ssh-agent
.另请参阅Configuring Git over SSH to login once、GitHub's help page on ssh key passphrases、gitolite's ssh documentation 和 Heroku's ssh keys documentation。
在 GitHub(或 Heroku 或...)的多个帐户之间进行选择
如果您在 GitHub 或 Heroku 等地方拥有多个帐户,则您将拥有多个 ssh 密钥(每个帐户至少一个)。要选择您要登录的帐户,您必须tell ssh which private key to use。
例如,假设您有两个 GitHub 帐户:foo
和 bar
。 foo
的 ssh 密钥是 ~/.ssh/foo_github_id
,bar
的 ssh 密钥是 ~/.ssh/bar_github_id
。您想使用您的foo
帐户访问git@github.com:foo/foo.git
,并使用您的bar
帐户访问git@github.com:bar/bar.git
。您可以将以下内容添加到您的~/.ssh/config
:
Host gh-foo
Hostname github.com
User git
IdentityFile ~/.ssh/foo_github_id
Host gh-bar
Hostname github.com
User git
IdentityFile ~/.ssh/bar_github_id
然后您将克隆这两个存储库,如下所示:
git clone gh-foo:foo/foo.git # logs in with account foo
git clone gh-bar:bar/bar.git # logs in with account bar
完全避免使用 ssh
一些服务提供 HTTP 访问作为 ssh 的替代方案:
GitHub:
https://username:password@github.com/username/repository.git
霸道:
https://username:password@gitorious.org/project/repository.git
Heroku:见this support article。
警告:将您的密码添加到克隆 URL 将导致 Git 将您的纯文本密码存储在 .git/config
中。要在使用 HTTP 时安全地存储您的密码,请使用凭证助手。例如:
git config --global credential.helper cache
git config --global credential.https://github.com.username foo
git clone https://github.com/foo/repository.git
以上将导致 Git 每 15 分钟询问一次您的密码(默认情况下)。详情请见git help credentials
。
【讨论】:
这是对 git 如何与 SSH 一起工作的最佳解释。我的理解是,当您指定 git@githost.com:path/to/repo.git 时,它有效地告诉 git 用户是 git 本身,并且它应该从 ssh-agent 获取您的凭据(公钥)主机“githost.com”。【参考方案3】:如果出现问题,请按照此参数替换为您的特殊情况:
! # $ & ' ( ) * + , / : ; = ? @ [ ]
%21 %23 %24 %26 %27 %28 %29 %2A %2B %2C %2F %3A %3B %3D %3F %40 %5B %5D
例如-
实际网址:https://usern@me:p@ssword@git/reponame.git
要使用的解决方案 URL:https://usern%40me:p%40ssword@git/reponame.git
【讨论】:
这正是我一直在寻找的问题,而且答案很有效。非常感谢。 欢迎大佬,希望对需要这个信息的人有所帮助 谢谢!你从随机的谷歌搜索中拯救了我。 thhhaaannnk,2 天后你解决了我的问题 与其胡闹,不如使用这个命令:MYPASS=`echo -n "$ORIGPASS" | jq -sRr @uri`【参考方案4】:在@Bassetassen 的answer 的cmets 中,@plosco 提到至少可以使用git clone https://<token>@github.com/username/repository.git
从GitHub 克隆。我想我会详细说明如何做到这一点,以防有人像我在尝试自动化一些克隆时遇到这个答案。
GitHub 有一个 very handy 指南,说明如何执行此操作,但它不包含如果您想将所有内容包含在一行中以实现自动化目的该怎么做。它警告 将令牌添加到克隆 URL 会将其以纯文本形式存储在 .git/config
。对于几乎每个用例来说,这显然都是一个安全风险,但由于我计划在完成后删除 repo 并撤销令牌,所以我不在乎。
1。创建令牌
GitHub 上有一个关于如何获取令牌的 whole guide here,但这里是 TL;DR。
-
转到设置 > 开发者设置 > 个人访问令牌 (here's a direct link)
单击“生成新令牌”并再次输入您的密码。 (here's another direct link)
为其设置描述/名称,检查“repo”权限并点击页面底部的“Generate token”按钮。
在离开页面之前复制您的新令牌
2。克隆回购
与@plosco 给出的命令相同,git clone https://<token>@github.com/<username>/<repository>.git
,只需将<token>
、<username>
和<repository>
替换为您的任何信息即可。
如果你想将它克隆到特定的文件夹,只需在末尾插入文件夹地址:git clone https://<token>@github.com/<username>/<repository.git> <folder>
,<folder>
是你猜对了,就是要克隆到的文件夹!您当然可以在这里使用.
、..
、~
等,就像在其他地方一样。
3。不留痕迹
并非所有这些都是必要的,具体取决于您所做的事情的敏感程度。
如果您一段时间内不打算使用该令牌,您可能不想让它闲置,因此请返回tokens page 并点击它旁边的删除按钮。 如果您不再需要 repo,请将其删除rm -rf <folder>
。
如果确实需要 repo,但不需要再次自动化,您可以通过 git remote remove origin
删除远程,或者通过运行 git remote set-url origin https://github.com/<username>/<repository.git>
删除令牌。
清除您的 bash 历史记录,以确保令牌不会一直记录在那里。有很多方法可以做到这一点,请参阅 this question 和 this question。但是,在上述所有命令前加上一个空格可能会更容易,以防止它们被存储起来。
请注意,我不是专业人士,因此上述内容可能不安全,因为不会为任何形式的取证工作留下任何痕迹。
【讨论】:
https://<token>@github.com
未被我的门户接受,我不得不使用 https://oauth2:<token>@github.com
@MushyPeas 这个答案只使用<token>
对我使用个人访问令牌效果很好。【参考方案5】:
虽然有很多答案,但当用户名或密码中包含特殊字符时,我自己面临着重复的问题。
对 git 的用户名和密码进行 URL 编码,然后将其用作 URL 本身的一部分(当没有安全问题时)。
比如说,用户名的 URL 编码值
'user+1'是用户%2B1
和密码的 URL 编码值
'Welcome@1234' 是 Welcome%401234
那么您的 GIT 克隆 URL 将如下所示,
git clone https://user%2B1:Welcome%401234@actual-git-url-for-the-repo
完美运行,而git clone https://user+1:Welcome@1234@actual-git-url-for-the-repo 给你 403 错误
希望这会有所帮助。
以防万一,想在线进行 URL 编码:https://www.urlencoder.org/
【讨论】:
【参考方案6】:我通过以下方式解决了这个问题:
【讨论】:
在命令行中输入密码绝不是一个好主意。您知道您的系统可能会将命令行历史记录存储在文件中吗? (例如:Linux 有一个名为 .bash_history 的隐藏文件) 正确。每当我这样做或类似的事情时,有时会非常方便,我总是从历史记录中删除我使用的命令(history -d)。 @FrancescoMarchetti-Stasi 您不需要删除命令,只需在命令开头使用一个空格,它将永远不会存储在历史记录中。 是的——我是在几个月前才知道的,在 Unix 系统上工作了将近 30 年后……真丢脸 :) ...除非您在存储您键入的命令的公司服务器上。命令行上的密码从来都不是一个好主意。【参考方案7】:您必须使用 2021 年 8 月 13 日之后
Git 克隆
https://username:token@github.com/username/repository.git
生成令牌:
设置>>开发者设置>>个人访问令牌>>生成新令牌
Git 推送克隆成功后,下次git push
就不用再提用户名了。您可以通过在记事本中打开.git/config
文件来确认这一点
[remote "origin"]
url = https://username:tokenxxxxxxxxxx@github.com/username/repo.git
【讨论】:
【参考方案8】:在 Windows 上,当git clone
ing 时,以下步骤应该会重新触发 GitHub 登录窗口:
【讨论】:
【参考方案9】:如果您正在使用 http/https
并且希望完全自动化该过程,而不需要任何用户输入或任何用户提示(例如:在 CI/CD 管道内) ,您可以使用以下方法利用git credential.helper
GIT_CREDS_PATH="/my/random/path/to/a/git/creds/file"
# Or you may choose to not specify GIT_CREDS_PATH at all.
# See https://git-scm.com/docs/git-credential-store#FILES for the defaults used
git config --global credential.helper "store --file $GIT_CREDS_PATH"
echo "https://alice:$ALICE_GITHUB_PASSWORD@github.com" > $GIT_CREDS_PATH
您可以选择从之前的 shell 命令或管道配置等中设置 ALICE_GITHUB_PASSWORD
环境变量。
请记住,基于“存储”的 git-credential-helper 以纯文本形式存储密码和值。因此,请确保您的令牌/密码具有非常有限的权限。
现在只需在自动化系统需要获取 repo 的任何地方使用 https://alice@github.com/my_repo.git - 它将使用 github.com
中 alice
的凭据作为 git-credential-helper 的存储。
【讨论】:
【参考方案10】:git config --global core.askpass
在克隆之前先运行这个,应该是固定的!
【讨论】:
试了那个,还是不行。 设置 global 配置绝不是一个好主意,因为它可能会弄乱其他克隆。【参考方案11】:我更喜欢使用GIT_ASKPASS 环境为 git 提供 HTTPS 凭据。
假设登录名和密码在USR
和PSW
变量中导出,以下脚本不会在历史和磁盘中留下密码痕迹+不易受到密码中特殊字符的影响:
GIT_ASKPASS=$(mktemp) && chmod a+rx $GIT_ASKPASS && export GIT_ASKPASS
cat > $GIT_ASKPASS <<'EOF'
#!/bin/sh
exec echo "$PSW"
EOF
git clone https://$USR@example.com/repo.git
NB:注意 heredoc 标记 'EOF'
周围的单引号,这意味着临时脚本实际上包含 $PSW
字符,而不是 PSW
变量的密码/扩展值
【讨论】:
如果您转义美元符号 -\$PSW
,您将避免不必要地将密码嵌入到临时文件中
@Marcin 这正是我的食谱要避免的:GIT_ASKPASS 中提到的临时文件只包含 PSW 变量的名称,而不是它的值
@MarcinWisnicki 请告知您的 shell 的名称和版本。它在 Ubuntu Dash (/bin/sh) 0.5.11 和 Bash 5.1.8 中运行良好(但预计也可以在两者的早期版本中运行)。请检查您是否按照清单中的规定在cat >$GIT_ASKPASS <<'EOF'
中将EOF
放在了单引号中
谢谢,围绕 EOF 的 qoutes 让一切变得不同!【参考方案12】:
这是一个很好的 Stack Overflow 问题,答案很有启发性,因此我能够解决我最近遇到的一个烦人的问题。
我工作的组织使用 Atlassian's BitBucket
产品(不是 Github),本质上是他们的 GitHub 版本,因此可以在本地完全保护存储库。我遇到了与@coordinate 类似的问题,因为我签出的新存储库需要我的密码。我的凭据已为所有 BitBucket
项目全局保存,因此我不确定是什么导致凭据丢失。
简而言之,我能够输入以下 GIT 命令(仅提供我的用户名),然后提示 Git 的凭据管理器提示我输入密码,然后我可以保存密码。
git clone https://user@code.domain.org/git/[organization]/[team]/[repository.git]
注意:括号中的目录子路径只是指内部引用,并且会因您而异!
【讨论】:
以上是关于运行“git clone git@remote.git”时如何提供用户名和密码?的主要内容,如果未能解决你的问题,请参考以下文章