协慌网

登录 贡献 社区

运行 “git clone [email protected]” 时如何提供用户名和密码?

我知道如何为这样的 HTTPS 请求提供用户名和密码:

git clone https://username:password@remote

但我想知道如何向远程用户提供用户名和密码,如下所示:

git clone [email protected]

我已经试过像这样:

git clone username:password@[email protected]
git clone git@username:[email protected]
git clone [email protected]@username:password

但是他们没有工作。

答案

基于 Michael Scharf 的评论:

您可以省略密码,以免将其记录在 Bash 历史记录文件中:

git clone https://[email protected]/username/repository.git

它将提示您输入密码。

或者,您可以使用:

git clone https://username:[email protected]/username/repository.git

这种方式从 GitHub 存储库为我工作。

user@host:path/to/repo格式告诉 Git 使用 ssh 登录到具有用户名user host 。从git help clone

ssh 协议也可以使用类似 scp 的语法:

[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 。您的foo ssh 密钥是~/.ssh/foo_github_id ,而bar的 ssh 密钥是~/.ssh/bar_github_id 。您想使用您的foo帐户访问[email protected]:foo/foo.git ,并使用您的bar帐户访问[email protected]:foo/foo.git [email protected]: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 的替代方法:

警告 :将密码添加到克隆 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

在 @Bassetassen 的答案的评论中,@ plosco 提到您至少可以使用git clone https://<token>@github.com/username/repository.git从 GitHub 进行克隆。我以为我会扩展方法,以防万一有人像我在尝试自动克隆时那样遇到此问题。

GitHub 上有关于如何执行此操作的非常方便的指南,但是如果您出于自动化目的将所有内容都包含在一行中,则它并未涵盖如何做。它警告说, 将令牌添加到克隆 URL 会将其以纯文本格式存储在 .git/config 。显然,这几乎对每个用例都是安全风险,但是由于我计划在完成后删除存储库并吊销令牌,因此我不在乎。

1. 创建一个令牌

GitHub 上有关于如何获取令牌的完整指南 ,但这是 TL; DR。

  1. 转到“设置”>“开发人员设置”>“个人访问令牌”这是直接链接
  2. 单击 “生成新令牌”,然后再次输入密码。 (这是另一个直接链接
  3. 为其设置描述 / 名称,检查 “回购” 权限,然后单击页面底部的 “生成令牌” 按钮。
  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>
  • 如果确实需要再次回购,但又不需要使其自动化,则可以通过执行git remote remove origin来删除远程,或者通过运行git remote set-url origin https://github.com/<username>/<repository.git>删除令牌。 git remote set-url origin https://github.com/<username>/<repository.git>
  • 清除您的 bash 历史记录,以确保令牌不会一直记录在那里。有很多方法可以执行此操作,请参见此问题此问题 。但是,将所有以上命令前面加一个空格以防止它们开始存储可能会更容易。

请注意,我不是专家,因此从某种意义上讲,任何形式的法证工作都不会留下任何痕迹,因此上述内容可能并不安全。