在 Bash 脚本中为 Git 提供密码

Posted

技术标签:

【中文标题】在 Bash 脚本中为 Git 提供密码【英文标题】:Supplying a password to Git in a Bash script 【发布时间】:2015-09-21 23:47:43 【问题描述】:

我想通过 Bash 脚本提供密码。我尝试了以下方法:

echo 'mypass' | git pull

git pull < 'mypass'

git pull < echo 'mypass'

似乎没有一个工作。

【问题讨论】:

快速提问:为什么? @TheGeorgeous 它用于应用程序测试人员的自动部署脚本。脚本中的内容不仅仅是从 repo 中提取代码。 @jax,想知道你是否最终能找到解决方案。 现在不记得了。不过我想我确实找到了办法。 This answer 包含一个示例 bash 脚本,可与 git 的凭据 API 一起使用。 【参考方案1】:

    使用内容创建文件git_password.sh

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

    将您的密码分配给 GIT_PASSWORD 环境变量

    $ GIT_PASSWORD=your_password
    

    使用 GIT_ASKPASS 环境变量执行 git 命令。它将强制提示密码并执行 git_password.sh 作为回调:

    $ GIT_ASKPASS=./git_password.sh git clone $REPO
    

【讨论】:

当你需要从 shell 脚本克隆存储库时,这只是一个简单的解决方案,因为你的当前文件夹中还没有 git 环境。 也可以使用参数-c "core.askPass=/path/askpass.sh"【参考方案2】:

gitcredentials 是答案:

描述

Git 有时需要用户提供凭据才能执行操作;例如,它可能需要输入用户名和密码才能通过 HTTP 访问远程存储库。本手册介绍了 Git 用于请求这些凭据的机制,以及避免重复输入这些凭据的一些功能。

[...]

请求凭据

如果没有定义任何凭证助手,Git 将尝试以下策略来询问用户的用户名和密码:

    如果设置了GIT_ASKPASS 环境变量,则调用该变量指定的程序。在命令行上为程序提供合适的提示,并从其标准输出中读取用户的输入。 否则,如果设置了core.askPass配置变量,则使用其值如上。 否则,如果设置了SSH_ASKPASS环境变量,则使用其值如上。 否则会在终端提示用户。

[...]

另一方面,凭证助手是 Git 可以请求用户名和密码的外部程序;它们通常与操作系统或其他程序提供的安全存储接口。

您可能还安装了第三方助手;在git help -a 的输出中搜索credential-*,并查阅各个助手的文档。一旦你选择了一个助手,你可以告诉 Git 使用它,方法是把它的名字放到 credential.helper 变量中。

git help -a | grep credential-* 显示以下助手:

  credential                remote
  credential-cache          remote-ext
  credential-cache--daemon  remote-fd
  credential-osxkeychain    remote-ftp
  credential-store          remote-ftps

【讨论】:

git help -a | grep credentials-* 应该是git help -a | grep credential-* @Cpt.Senkfuss 感谢纠正。我确定了答案。 设置core.askPass使用git config --global core.askPass "new-value"。要查看配置值,请使用git config --global core.askPass(没有新值)。请注意,除了--global,还有--system 作用域(和--local 作用域,但仅在克隆存储库之后)。【参考方案3】:

可以像这样在遥控器的定义中包含密码:

https://user:password@server

这样你不需要为每次拉取提供它。

(很像 How do I provide a username and password when running “git clone git@remote.git”? 中建议的解决方案。)

警告:更好的方法是使用 SSH 而不是 HTTPS,并将您的公钥存储在 GitHub 中。因为远程 url 中的凭据可能会出现在命令历史记录、脚本或配置文件中,然后其他人可以看到。

【讨论】:

这应该是危险的吗?密码保存在 git log 中? URL(包括密码)将以纯文本形式存储在.git/config 中作为远程URL。因此,有权访问克隆存储库的每个人都将能够看到密码。此外,该 URL 很可能会再次通过网络发送以启动与远程的连接。总的来说,这种方法是最不安全的。【参考方案4】:

向 Bash 脚本提供输入的主要技术位于 "Automatically enter input in command line"

echo 'mypass' | git pull
# or
printf 'mypass\n' | git pull

从 Git 1.8.3 开始,我更喜欢使用 Git credential netrc helper,它会为我获取并提供正确的密码。

【讨论】:

我认为\n 可能是我所缺少的。密码可能已经输入,但从未按下回车键,因此从未执行。我需要在星期一试试这个。 使用printf 'mypass\n' | git pull毕竟没有用。 @jax 您使用的是什么操作系统、bash 和 git 版本? 带有默认 bash 的 Fedora 20 不确定 git 版本,但可能是 repo 提供的最新版本

以上是关于在 Bash 脚本中为 Git 提供密码的主要内容,如果未能解决你的问题,请参考以下文章

在 bash 脚本中为 ssh 命令提供密码,无需使用公钥和 Expect

bash 脚本从 bash 脚本添加 git 凭据

如何从脚本中为 sudo 提供密码?

在SSH中使用bash脚本时,为Git输入私钥密码

在 Bash 脚本中使用 Expect 为 SSH 命令提供密码

在 git 存储库中处理密码的最佳实践是啥?