如何在脚本中为git clone提供用户名/密码,但不将凭据存储在.git / config中


31

我正在像这样的脚本中克隆git存储库:

git clone https://user:password@host.com/name/.git

这可行,但是我的用户名和密码!现在存储在中的原始网址中.git/config

如何防止这种情况,但仍在脚本中执行(因此无需手动输入密码)?


您可能之后可以更新原点:git remote set-url origin https://host.com/name/.git
ceejayoz

@ceejayoz是的,那是可能的。谢谢你的主意。我仍然希望有一个解决方案,甚至不临时存储凭据。
内森

4
当然-将基于SSH的身份验证与密钥一起使用。
ceejayoz

2
您使用https而不是SSH是否有原因?SSH支持密钥。
mzhaase

我理解这个问题,但是为什么密码存储在脚本中还可以呢?那同样不好。
马丁·考特

Answers:


20

我使用的方法是实际使用a git pull而不是克隆。该脚本如下所示:

mkdir repo
cd repo
git init
git config user.email "email"
git config user.name "user"
git pull https://user:password@github.com/name/repo.git master

这不会在中存储您的用户名或密码.git/config。但是,除非采取其他步骤,否则从显示当前进程(例如ps)的命令运行进程时,将显示纯文本用户名和密码。

我会提出的另一项建议(如果您不能使用ssh)是实际上使用OAuth令牌而不是纯文本用户名/密码,因为它稍微安全些。您可以从个人资料设置中生成OAuth令牌:https : //github.com/settings/tokens

然后使用该令牌,pull命令将是

git pull https://$OAUTH_TOKEN:x-oauth-basic@github.com/name/repo.git master

毫无疑问,我不能使用身份验证令牌。我不是使用github,而是私有服务器。
内森

3
还应注意的是,例如,ps在拉动运行时,用户名和密码将是可见的(至少除非您已阻止用户看到彼此的进程)
derobert

宣誓要点。这正是我在生产/登台/开发中所需要的。
RobotHumans

一百万感谢您的伙伴。浪费了数小时或数小时,终于您的答案得以恢复。:thumbsup
JasdeepSingh

17

IMO最好的解决方案是使用自定义GIT_ASKPASS帮助程序,并将密码作为另一个环境变量传递。因此,例如,将文件创建git-askpass-helper.sh为:

#!/bin/sh
exec echo "$GIT_PASSWORD"

然后git clone https://username@hostname/repo使用环境变量GIT_ASKPASS=/path/to/git-askpass-helper.sh和运行GIT_PASSWORD=nuclearlaunchcodes

这样做的好处是,密码也不会在进程列表中显示。


+1为创意解决方案。这将比git pull解决方案安全一些,并且允许您将纯文本密码作为秘密存储在所选的自动部署工具中。
FGreg

13

您可以在其中输入连接凭据 ~/.netrc文件中。类似于以下内容:

machine host.example.net
login bart
password eatmyshorts

只需确保将文件chmod更改为600即可。如果您使用的是Windows,则以下链接可能会有用:https : //stackoverflow.com/questions/6031214/git-how-to-use-netrc-file-on- Windows保存用户和密码

就个人而言,我倾向于使用SSH密钥进行身份验证(当然,如果允许的话)。


好吧,这会将我的密码保留在〜/ .netrc中。我也不想那样。
内森

2

经过之后 数十篇 SO帖子,博客等之后,我尝试了每种方法,这就是我想出的方法。它涵盖了一切。

请参阅Git凭证和私有软件包备忘单

这些都是可以安全地验证git来克隆存储库的方式和工具。 而无需交互式密码提示的

  • SSH公钥
    • SSH_ASKPASS
  • API访问令牌
    • GIT_ASKPASS
    • .gitconfig代替
    • .gitconfig [凭证]
    • .git-credentials
    • .netrc
  • 奖励:适用于私人套餐
    • 节点/ npm package.json
    • python / pip /鸡蛋要求.txt
    • 红宝石宝石Gemfile
    • golang go.mod

没有明文存储的最佳选择

根据此处的要求,SSH Keys GIT_ASKPASSgit credential store使用OS Keychain管理器可能是最佳选择。

由于GIT_ASKPASS可能是三者中最不了解的,因此我将在此处详细说明-其他内容都在备忘单中。

GIT_ASKPASS

如何创建GIT_ASKPASS脚本:

echo 'echo $MY_GIT_TOKEN' > $HOME/.git-askpass

如何使用它:

export MY_GIT_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export GIT_ASKPASS=$HOME/.git-askpass
git clone https://token@code.example.com/project.git

该脚本以以下形式接收标准输入:

Password for 'scheme://host.tld':

该脚本接收Git ENV,例如:

GIT_DIR=/Users/me/project/.git
GIT_EXEC_PATH=/usr/local/Cellar/git/2.19.0_1/libexec/git-core
GIT_PREFIX=

备忘单中有更多详细信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.