在 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