GIT_ASKPASS 包含用户名和密码

Mar*_*ara 7 git bash credentials

我正在使用 2.20.1 的 Docker 容器中工作git --version,基础映像是 Debian 10。我想使用GIT_ASKPASS甚至更好的配置属性通过 HTTPS 克隆 git 存储库core.askpass。这是我尝试过的:

GIT_ASKPASS=$(mktemp) && chmod a+rx $GIT_ASKPASS && export GIT_ASKPASS
cat > $GIT_ASKPASS <<< '#!/bin/bash
    exec printf "$JENKINS_CREDENTIALS_USR\n$JENKINS_CREDENTIALS_PSW\n"
'
Run Code Online (Sandbox Code Playgroud)

最初我在 Jenkins 中运行它,但我发现我能够在一个简单的 docker 容器中重现相同的问题。$JENKINS_CREDENTIALS_USR$JENKINS_CREDENTIALS_PSW定义如下:

JENKINS_CREDENTIALS_USR=myuser
JENKINS_CREDENTIALS_PSW=mypass
export JENKINS_CREDENTIALS_USR
export JENKINS_CREDENTIALS_PSW
Run Code Online (Sandbox Code Playgroud)

我没有设置任何全局配置属性。~/.git-credentials不存在。错误是:

fatal: Authentication failed for 'https://myserver.com/git/project.git/' 
Run Code Online (Sandbox Code Playgroud)

它的工作原理是在 HTTPS url 中指定用户名,如下所示

git clone https://jenkins@myserver.com/git/project.git .
Run Code Online (Sandbox Code Playgroud)

并仅在 指向的脚本中打印密码GIT_ASKPASS,所以我想知道为什么如果没有 url 中的用户名它就不起作用。文档明确指出

如果GIT_ASKPASS设置了环境变量,则调用该变量指定的程序。在命令行上向程序提供合适的提示,并从其标准输出中读取用户的输入

因为当我尝试克隆时,系统会要求我输入用户名和密码,原始GIT_ASKPASS脚本有什么问题?

Mar*_*ara 8

我在这里找到了解决方案。所有的功劳都归功于@AlexeyPelykh,我刚刚改编了他的剧本。


当尝试时git clone,我们的 shell 脚本会为每个提示行调用一次,基本上是:

$GIT_ASKPASS "Username for ..."
$GIT_ASKPASS "Password for ..."
Run Code Online (Sandbox Code Playgroud)

我的原始脚本中的问题是它返回的用户名和密码与我所要求的无关。这也是为什么在第二种情况下(在 URL 中指定用户名)它起作用的原因,事实上我只需要密码,它只返回密码。

这就是我更改原始脚本以使其与以下内容一起使用的方法GIT_ASKPASS

GIT_ASKPASS=$(mktemp) && chmod a+rx $GIT_ASKPASS && export GIT_ASKPASS
cat > $GIT_ASKPASS <<< '#!/bin/bash
case "$1" in
    Username*) exec echo "$JENKINS_CREDENTIALS_USR" ;;
    Password*) exec echo "$JENKINS_CREDENTIALS_PSW" ;;
esac
'
Run Code Online (Sandbox Code Playgroud)

如果您想使用配置变量core.askPass,请将前两行替换为以下内容:

git_askPass_script=$(mktemp) && chmod a+rx $git_askPass_script
cat > $git_askPass_script <<< '#!/bin/bash
Run Code Online (Sandbox Code Playgroud)

并设置配置变量:

git config --global core.askPass "$git_askPass_script"
Run Code Online (Sandbox Code Playgroud)

或者甚至更好

git -c core.askPass="$git_askPass_script" clone ...
Run Code Online (Sandbox Code Playgroud)