为什么我不能使用GIT_ASKPASS回声

时间:2016-11-16 07:10:48

标签: git sh

我正在尝试通过GIT_ASKPASS提供git密码,如下所示:

export PASSWORD=<secret>
export GIT_ASKPASS="/usr/bin/echo $PASSWORD"
git clone https://username@domain.com/git-repo/repo.git

但我明白了:

 error: cannot run /usr/bin/echo <secret>: No such file or directory

所以我似乎不允许在GIT_ASKPASS中提供参数?

现在我可以创建一个只包含以下内容的脚本:

/usr/bin/echo $PASSWORD

但我想知道:有没有办法在不创建临时脚本的情况下这样做?

3 个答案:

答案 0 :(得分:4)

主要问题是整个变量被解释为程序名称。那么制作另一个脚本怎么样呢,我们称它为password_provider.sh,它会告诉我们密码?

#! /bin/sh
echo <secret>

然后你可以运行:export GIT_ASKPASS="./password_provider.sh"

安全通知

请记住,这意味着以纯文本格式存储密码,这通常不是一个好的安全措施。您应该尽可能使用公钥认证或真credential helper

答案 1 :(得分:2)

您正在寻找错误位置的回声。尝试运行whereis echo并替换它,在mac echo上位于/bin/echo

答案 2 :(得分:0)

问题

正如其他人所说,您不能在字符串内传递参数。整个字符串被解释为命令。

# this works
echo foo
# this does not
"echo foo"

工作解决方案

我经历了如何做的每一次可能的迭代:

  • SSH公钥
    • SSH_ASKPASS
  • API访问令牌
    • GIT_ASKPASS
    • .gitconfig代替
    • .gitconfig [凭据]
    • .git-credentials
    • .netrc

我整理了每个清单。单。方法。确实有效。

我实际上建议使用 .gitconfig代替方法,但是对于GIT_ASKPASS,这就是我所做的:

来自Git Credentials & Private Packages Cheatsheet

如何创建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=

cheatsheet中的更多详细信息。