GIT_ASKPASS 用户名和密码
GIT_ASKPASS with user and password
我正在使用 git --version
2.20.1 的 Docker 容器中工作,基本映像是 Debian 10。我想使用 [= 通过 HTTPS 克隆一个 git 存储库16=] 甚至更好的配置 属性 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"
'
最初我在 Jenkins 中 运行 它,但我发现我能够在一个简单的 docker 容器中重现相同的问题。 $JENKINS_CREDENTIALS_USR
和 $JENKINS_CREDENTIALS_PSW
定义如下:
JENKINS_CREDENTIALS_USR=myuser
JENKINS_CREDENTIALS_PSW=mypass
export JENKINS_CREDENTIALS_USR
export JENKINS_CREDENTIALS_PSW
我没有设置任何全局配置 属性。 ~/.git-credentials
不存在。错误是:
fatal: Authentication failed for 'https://myserver.com/git/project.git/'
它通过在 HTTPS url 中指定用户名来工作,就像这样
git clone https://jenkins@myserver.com/git/project.git .
并且只在 GIT_ASKPASS
指向的脚本中打印密码,所以我想知道为什么没有 url 中的用户名它就不能工作。 documentation 明确表示
If the GIT_ASKPASS
environment variable is set, the program specified by the variable is invoked. A suitable prompt is provided to the program on the command line, and the user's input is read from its standard output.
因为当我尝试克隆时,系统要求我同时输入用户名和密码,原始 GIT_ASKPASS
脚本有什么问题?
我找到了解决方案 here。所有学分归于@AlexeyPelykh,我刚刚改编了他的剧本。
当尝试 git clone
时,我们的 shell 脚本为每个提示行调用一次,基本上:
$GIT_ASKPASS "Username for ..."
$GIT_ASKPASS "Password for ..."
我的原始脚本中的问题是 returns 用户名和密码与我要求的内容无关。这也是为什么在第二种情况下(使用 URL 中指定的用户名)它有效的原因,实际上我只需要密码,它 returns 仅此而已。
这就是我更改原始脚本以使其与 GIT_ASKPASS
一起工作的方式:
GIT_ASKPASS=$(mktemp) && chmod a+rx $GIT_ASKPASS && export GIT_ASKPASS
cat > $GIT_ASKPASS <<< '#!/bin/bash
case "" in
Username*) exec echo "$JENKINS_CREDENTIALS_USR" ;;
Password*) exec echo "$JENKINS_CREDENTIALS_PSW" ;;
esac
'
如果您想使用配置变量 core.askPass
,请用这些替换前两行:
git_askPass_script=$(mktemp) && chmod a+rx $git_askPass_script
cat > $git_askPass_script <<< '#!/bin/bash
并设置配置变量:
git config --global core.askPass "$git_askPass_script"
甚至更好
git -c core.askPass="$git_askPass_script" clone ...
我正在使用 git --version
2.20.1 的 Docker 容器中工作,基本映像是 Debian 10。我想使用 [= 通过 HTTPS 克隆一个 git 存储库16=] 甚至更好的配置 属性 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"
'
最初我在 Jenkins 中 运行 它,但我发现我能够在一个简单的 docker 容器中重现相同的问题。 $JENKINS_CREDENTIALS_USR
和 $JENKINS_CREDENTIALS_PSW
定义如下:
JENKINS_CREDENTIALS_USR=myuser
JENKINS_CREDENTIALS_PSW=mypass
export JENKINS_CREDENTIALS_USR
export JENKINS_CREDENTIALS_PSW
我没有设置任何全局配置 属性。 ~/.git-credentials
不存在。错误是:
fatal: Authentication failed for 'https://myserver.com/git/project.git/'
它通过在 HTTPS url 中指定用户名来工作,就像这样
git clone https://jenkins@myserver.com/git/project.git .
并且只在 GIT_ASKPASS
指向的脚本中打印密码,所以我想知道为什么没有 url 中的用户名它就不能工作。 documentation 明确表示
If the
GIT_ASKPASS
environment variable is set, the program specified by the variable is invoked. A suitable prompt is provided to the program on the command line, and the user's input is read from its standard output.
因为当我尝试克隆时,系统要求我同时输入用户名和密码,原始 GIT_ASKPASS
脚本有什么问题?
我找到了解决方案 here。所有学分归于@AlexeyPelykh,我刚刚改编了他的剧本。
当尝试 git clone
时,我们的 shell 脚本为每个提示行调用一次,基本上:
$GIT_ASKPASS "Username for ..."
$GIT_ASKPASS "Password for ..."
我的原始脚本中的问题是 returns 用户名和密码与我要求的内容无关。这也是为什么在第二种情况下(使用 URL 中指定的用户名)它有效的原因,实际上我只需要密码,它 returns 仅此而已。
这就是我更改原始脚本以使其与 GIT_ASKPASS
一起工作的方式:
GIT_ASKPASS=$(mktemp) && chmod a+rx $GIT_ASKPASS && export GIT_ASKPASS
cat > $GIT_ASKPASS <<< '#!/bin/bash
case "" in
Username*) exec echo "$JENKINS_CREDENTIALS_USR" ;;
Password*) exec echo "$JENKINS_CREDENTIALS_PSW" ;;
esac
'
如果您想使用配置变量 core.askPass
,请用这些替换前两行:
git_askPass_script=$(mktemp) && chmod a+rx $git_askPass_script
cat > $git_askPass_script <<< '#!/bin/bash
并设置配置变量:
git config --global core.askPass "$git_askPass_script"
甚至更好
git -c core.askPass="$git_askPass_script" clone ...