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

Nat*_*han 51 git

我在这样的脚本中克隆了一个 git 存储库:

git clone https://user:password@host.com/name/.git
Run Code Online (Sandbox Code Playgroud)

这有效,但我的用户名和密码!现在存储在.git/config.

我怎样才能防止这种情况,但仍然在脚本中执行此操作(因此无需手动输入密码)?

FGr*_*reg 29

我使用的方法是实际使用 agit 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
Run Code Online (Sandbox Code Playgroud)

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

正如评论中提到的,由于此方法使用 HTTPS,因此您还必须对密码中可能出现的任何特殊字符进行 URL 编码

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

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

git pull https://$OAUTH_TOKEN:x-oauth-basic@github.com/name/repo.git master
Run Code Online (Sandbox Code Playgroud)

  • 还应该注意的是,在 pull 运行时,用户名和密码将在例如 `ps` 中可见(至少除非你阻止用户看到彼此的进程) (3认同)

int*_*tgr 25

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

#!/bin/sh
exec echo "$GIT_PASSWORD"
Run Code Online (Sandbox Code Playgroud)

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

这样做的好处是密码在进程列表中也不可见。


coo*_*j86 16

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

请参阅Git 凭证和私有包速查表

这些都是您可以安全地对 git 进行身份验证以在没有交互式密码提示的情况下克隆存储库的方法和工具。

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

无明文存储的最佳选择

从这里询问的内容来看,SSH 密钥GIT_ASKPASSgit credential store使用 OS Keychain 管理器可能是最佳选择。

由于 GIT_ASKPASS 可能是这 3 个中最不了解的,我将在此处详细说明 - 其他在备忘单中。

GIT_ASKPASS

如何创建GIT_ASKPASS脚本:

echo 'echo $MY_GIT_TOKEN' > $HOME/.git-askpass
Run Code Online (Sandbox Code Playgroud)

如何使用它:

export MY_GIT_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export GIT_ASKPASS=$HOME/.git-askpass
git clone https://token@code.example.com/project.git
Run Code Online (Sandbox Code Playgroud)

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

Password for 'scheme://host.tld':
Run Code Online (Sandbox Code Playgroud)

该脚本接收 Git ENV,例如:

Password for 'scheme://host.tld':
Run Code Online (Sandbox Code Playgroud)

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


Bre*_*ene 15

您可以在~/.netrc文件中输入您的连接凭据。类似的东西:

machine host.example.net
login bart
password eatmyshorts
Run Code Online (Sandbox Code Playgroud)

只需确保将该文件 chmod 为 600。如果您使用的是 Windows,以下链接可能有用:https : //stackoverflow.com/questions/6031214/git-how-to-use-netrc-file-on- windows-to-save-user-and-password

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