运行"git clone git@remote.git"时如何提供用户名和密码?

coo*_*ate 747 git

我知道如何为HTTPS请求提供用户名和密码,如下所示:

git clone https://username:password@remote
Run Code Online (Sandbox Code Playgroud)

但我想知道如何为遥控器提供用户名和密码,如下所示:

git clone git@remote.git
Run Code Online (Sandbox Code Playgroud)

我试过这样的:

git clone username:password@git@remote.git
git clone git@username:password@remote.git
git clone git@remote.git@username:password
Run Code Online (Sandbox Code Playgroud)

但他们没有奏效.

Bas*_*sen 1157

使用:

git clone https://username:password@github.com/username/repository.git
Run Code Online (Sandbox Code Playgroud)

这种方式对我来说是一个GitHub存储库.

基于Michael Scharf的评论:

您可以省略密码,以便它不会记录在您的Bash历史记录文件中:

git clone https://username@github.com/username/repository.git
Run Code Online (Sandbox Code Playgroud)

它会提示您输入密码.

  • 您可以省略密码:`git clone https:// username @ github.com/username/repository.git`.git会问你,它不会保存在.git/config中,也不会保存在你的bash历史记录中 (55认同)
  • @MrDuk没问题,逃脱它(如%40 iirc). (53认同)
  • 不建议将此文件的URL中的密码保存在.git/config上.不安全,最好使用ssh密钥 (42认同)
  • 你也可以在行的开头输入'space',这样linux就不会在历史记录中存储命令 (27认同)
  • 顺便说一句,它不一定是一样的.如果您的同事创建了git repo并且您以另一个帐户登录,则它们将不同. (4认同)
  • !as%21 # as%23 $as %24 &as %26 ' as%27 (as %28 )as %29 * as%2A + as%2B , as%2C /as %2F : as%3A ;as%3B =as%3D ?as%3F @as%40 [as%5B] as%5D (3认同)
  • 您还可以在命令前添加空格.这样,它就不会存储在您的bash历史记录中. (3认同)
  • 我喜欢的另一个选项是使用和auth令牌而不是用户名来通过任何提示`git clone https:// <token> @ github.com/username/repository.git` (3认同)
  • 如果我的密码包含“ @”符号,该如何使用 (2认同)
  • 如果您使用格式 ``git clone https://username:password@github.com/username/repository.git`` 并出现错误消息 ``URL using bad / invalid format or Missing URL`` ,那么这是可能是密码中的特殊字符,然后使用 ``git clone https://username@github.com/username/repository.git`` 等待提示。 (2认同)
  • 现在已弃用,Github 建议使用个人令牌或 SSH。https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ (2认同)
  • 如果问题与 SSH 有关,为什么您会使用 HTTPS 解决方案来回答?SSH 的解决方案可行吗?不?然后将其写在您的答案中,如果您愿意,请告诉我们原因。 (2认同)

Ric*_*sen 197

user@host:path/to/repo格式告诉Git的使用ssh登录到host使用用户名user.来自git help clone:

另一种类似scp的语法也可以与ssh协议一起使用:

[user@]host.xz:path/to/repo.git/

前面的部分@是用户名,验证方法(密码,公钥等)由ssh确定,而不是Git.Git无法将密码传递给ssh,因为ssh甚至可能根本不使用密码,具体取决于远程服务器的配置.

使用ssh-agent以避免输入密码,所有的时间

如果您不想一直输入ssh密码,典型的解决方案是生成公钥/私钥对,将公钥放在远程服务器上的~/.ssh/authorized_keys文件中,然后将私钥加载到ssh-agent.另请参阅通过SSH配置Git以登录一次,关于ssh密钥密码的GitHub帮助页面,gitolite的ssh文档Heroku的ssh密钥文档.

在GitHub(或Heroku或......)的多个帐户之间进行选择

如果您在GitHub或Heroku这样的地方有多个帐户,您将拥有多个ssh密钥(每个帐户至少有一个).要选择要登录的帐户,您必须告诉ssh使用哪个私钥.

例如,假设您有两个GitHub帐户: foobar.你的ssh键foo~/.ssh/foo_github_id和你的ssh键bar~/.ssh/bar_github_id.您要访问git@github.com:foo/foo.git您的foo帐户,并git@github.com:bar/bar.git与您的bar帐户.您可以将以下内容添加到您的~/.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
Run Code Online (Sandbox Code Playgroud)

然后,您将克隆这两个存储库,如下所示:

git clone gh-foo:foo/foo.git  # logs in with account foo
git clone gh-bar:bar/bar.git  # logs in with account bar
Run Code Online (Sandbox Code Playgroud)

完全避免使用ssh

有些服务提供HTTP访问作为ssh的替代方法:

警告:将密码添加到克隆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
Run Code Online (Sandbox Code Playgroud)

以上将导致Git每15分钟(默认情况下)要求输入一次密码.详情git help credentials请见.

  • 这是 git 如何与 SSH 配合使用的最好解释。我的理解是,当您指定 git@githost.com:path/to/repo.git 时,它有效地告诉 git 用户是 git 本身,并且它应该从 ssh 代理获取您的凭据(公钥)主机“githost.com”。 (3认同)

Ans*_*han 56

如果它们造成问题,请按照以下参数替换为您的特殊情况:

 !   #   $   &   '   (   )   *   +   ,   /   :   ;   =   ?   @   [   ]

%21 %23 %24 %26 %27 %28 %29 %2A %2B %2C %2F %3A %3B %3D %3F %40 %5B %5D
Run Code Online (Sandbox Code Playgroud)

所以例如 -

实际网址: https://usern@me:p@ssword@git/reponame.git

要使用的解决方案 URL: https://usern%40me:p%40ssword@git/reponame.git

  • 这正是我正在寻找的问题,而且答案非常有效。多谢。 (8认同)
  • 不要浪费时间,请使用以下命令: MYPASS=\`echo -n "$ORIGPASS" | jq -sRr @uri\` (3认同)
  • 这看起来像是另一个问题的答案。 (2认同)

Har*_*ore 47

您必须使用 2021 年 8 月 13 日发布的帖子

\n
    \n
  • 克隆

    \n

    https://username:token@github.com/username/repository.git

    \n
  • \n
\n

生成令牌:

\n

设置\xe2\x86\x92开发人员设置\xe2\x86\x92个人访问令牌\xe2\x86\x92生成新令牌*

\n
    \n
  • git 推送
  • \n
\n

成功克隆后,下次执行此操作时git push,您将不必再次提及用户名。您可以通过在记事本.git/config中打开该文件来确认这一点。它将显示:

\n
[remote "origin"]\n    url = https://username:tokenxxxxxxxxxx@github.com/username/repo.git\n
Run Code Online (Sandbox Code Playgroud)\n


Rob*_*ose 30

在@Bassetassen的回答中,@ plosco 提到你git clone https://<token>@github.com/username/repository.git至少可以用来克隆GitHub.我想我会扩展如何做到这一点,以防任何人遇到这样的答案,就像我在尝试自动化克隆时所做的那样.

GitHub有一个非常方便的指导如何执行此操作,但它不包括如果您想将它们全部包含在一行以用于自动化目的,该怎么办.它警告说,将标记添加到克隆URL将以明文形式存储 .git/config.这显然是几乎所有用例的安全风险,但由于我计划在完成后删除回购并撤销令牌,我不在乎.

1.创建令牌

GitHub 在这里有关于如何获得令牌的完整指南,但这里是TL; DR.

  1. 转到设置>开发人员设置>个人访问令牌(这是直接链接)
  2. 单击"生成新令牌"并再次输入密码.(这是另一个直接链接)
  3. 设置它的描述/名称,检查"repo"权限并点击页面底部的"Generate token"按钮.
  4. 在离开页面之前复制新令牌

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.不留痕迹

并非所有这些都是必要的,这取决于你所做的事情的敏感程度.

  • 如果你有一段时间无意使用它,你可能不想留下那个令牌,所以回到令牌页面然后点击它旁边的删除按钮.
  • 如果您不再需要回购,请将其删除rm -rf <folder>.
  • 如果确实需要再次使用repo,但不需要再次自动执行,则可以通过执行git remote remove origin或仅通过运行删除令牌来删除远程git remote set-url origin https://github.com/<username>/<repository.git>.
  • 清除您的bash历史记录以确保令牌不会保留在那里.有很多方法可以做到这一点,请看这个问题这个问题.但是,可能更容易将前面的所有命令添加到空格中以防止它们被存储开始.

请注意,我不是专业人士,所以上述内容可能并不安全,因为任何法医工作都不会留下痕迹.

  • 我的门户不接受 `https://&lt;token&gt;@github.com`,我必须使用 `https://oauth2:&lt;token&gt;@github.com` (3认同)

Mas*_*ari 22

要克隆存储库,首先您应该生成一个访问令牌(您不能再使用您的登录密码),然后使用此生成的令牌克隆存储库。

\n

生成访问令牌:

\n

GitHub:
\n设置\xe2\x86\x92开发人员设置\xe2\x86\x92个人访问令牌\xe2\x86\x92生成新令牌

\n

Bitbucket :
\n设置\xe2\x86\x92个人 Bitbucket 设置\xe2\x86\x92应用程序密码\xe2\x86\x92创建应用程序密码

\n

克隆存储库:

\n

GitHub:

\n
git clone https://YOUR-USERNAME:GENERATED-TOKEN@github.com/YOUR-USERNAME/YOUR-REPOSITORY\n
Run Code Online (Sandbox Code Playgroud)\n

位桶:

\n
git clone https://YOUR-USERNAME@bitbucket.org/YOUR-REPOSITORY\n
Run Code Online (Sandbox Code Playgroud)\n

它将提示您输入生成的令牌。

\n


San*_*nan 15

尽管有很多答案,但是当用户名或密码中包含特殊字符时,我会遇到重复的问题。

URL对git的用户名和密码进行编码,然后将其用作URL本身的一部分(无需考虑安全性时)。

说,URL编码的用户名值

“用户+1”是用户%2B1

和密码的URL编码值

“ Welcome @ 1234”受到欢迎%401234

然后,您的GIT克隆网址将如下所示:

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/


mao*_*izm 11

我更喜欢使用GIT_ASKPASS环境向 Git 提供 HTTPS 凭据。
假设登录名和密码导出到USRandPSW变量中,以下脚本不会在历史记录和磁盘中留下密码痕迹,而且不易受到密码中特殊字符的影响:

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
Run Code Online (Sandbox Code Playgroud)

注意:请注意heredoc标记周围的单引号'EOF',这意味着临时脚本保存字面字符,而不是变量$PSW的密码/扩展值PSW


Beh*_*lem 9

我通过以下方式解决了这个问题:

在此输入图像描述

  • @FrancescoMarchetti-Stasi,您不需要删除命令,只需在命令开头使用空格,它就永远不会存储在历史记录中。 (11认同)
  • 在命令行中输入密码永远不是一个好主意。您知道系统可能会将命令行历史记录存储在文件中吗?(例如:Linux有一个名为.bash_history的隐藏文件) (7认同)

Rak*_*kib 8

如果您正在使用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}
Run Code Online (Sandbox Code Playgroud)

您可以选择ALICE_GITHUB_PASSWORD从以前的 shell 命令或管道配置等设置环境变量。

请记住,基于“存储”的 git-credential-helper 以纯文本形式存储密码和值。因此,请确保您的令牌/密码具有非常有限的权限。


现在只需使用HTTPS://alice@github.com/my_repo.git无论您的自动化系统需要获取回购-它将使用的凭据alicegithub.com通过GIT-凭证辅助的商店。


Ore*_*444 6

在Windows上,执行以下步骤应在git cloneing 时重新触发GitHub登录窗口:

  • 在开始菜单中搜索“凭据管理器”
  • 选择“ Windows凭据”
  • 删除任何与Git或GitHub相关的凭证

结果


Roh*_*han 5

git config --global core.askpass
Run Code Online (Sandbox Code Playgroud)

在以相同方式克隆之前先运行它,应该修复!

  • 试了那个,还是没有要求。 (5认同)