在Bash脚本中向Git提供密码

19

我希望能够在Bash脚本中提供一个密码。我已经尝试了以下内容:

echo 'mypass' | git pull

git pull < 'mypass'

git pull < echo 'mypass'

似乎没有一种方法起作用。


1
快速问题:为什么? - TheGeorgeous
1
@TheGeorgeous 这是一个自动部署脚本,用于应用程序测试人员。脚本中有很多内容,不仅仅是从代码库中拉取代码。 - jax
@jax,不知道你最终是否找到了解决方案。 - sergeyan
现在记不清了,但我想我已经找到了一种方法。 - jax
此答案包含一个示例 bash 脚本,可与 git 的凭据 API 一起使用。 - Roland Puntaier
4个回答

15
  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 环境。 - Sergey Bezugliy
    2
    您还可以使用参数-c“core.askPass=/path/askpass.sh” - akostadinov
    在Python中运行相同的代码:subprocess.run(['git', 'clone', '-c', 'core.askPass='+ROOT_PATH+'\git_password.sh', 'https://username@url_to_git_repo.git']) - frmbelz

    8

    gitcredentials就是答案:

    描述

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

    [...]

    请求凭据

    如果没有定义任何凭据助手,Git将尝试以下策略来要求用户提供用户名和密码:

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

    [...]

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

    您还可以安装第三方助手;在git help -a的输出中搜索credential-*,并查阅各个助手的文档。选择助手后,您可以通过将其名称放入credential.helper变量中告诉Git使用它。

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

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

    1
    git help -a | grep credentials-* should be git help -a | grep credential-* - Cpt. Senkfuss
    @Cpt.Senkfuss 感谢您的纠正。我已经修正了答案。 - barthel
    要设置 core.askPass,请使用 git config --global core.askPass "new-value"。要查看配置值,请使用 git config --global core.askPass(不带新值)。请注意,除了 --global 之外,还有 --system 范围(以及 --local 范围,但仅在克隆存储库后才能使用)。 - mihca

    6
    可以在远程定义中包含密码,方法如下:
    https://user:password@server
    

    就像这样,您不需要为每个拉取操作提供它。

    (就像在如何在运行“git clone git@remote.git”时提供用户名和密码?中建议的解决方案一样。)

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


    1
    这会有危险吗?密码保存在Git日志中? - Dee
    URL(包括密码)将以明文形式存储在.git/config中作为远程URL。因此,所有访问克隆仓库的人都能看到密码。此外,这个URL很可能会再次通过网络发送以启动与远程的连接。总体而言,这种方法是最不安全的。 - mihca

    2
    将英文翻译成中文:
    Bash脚本输入的主要技术在自动输入命令行中的输入
    echo 'mypass' | git pull
    # or
    printf 'mypass\n' | git pull
    

    自从Git 1.8.3版本以来,我更喜欢使用一个Git凭证netrc助手,它会为我获取并提供正确的密码。
    自Git 2.x以来,git凭证助手是首选。
    最新的(2022年)是微软(但跨平台) GCM(Git凭证管理器)

    它的文档现在除了密码之外还提到了令牌,随着Git 2.39(2022年第四季度)的推出:

    请参见提交54e95b4(由M Hickford (hickford于2022年11月8日提交)
    (由Taylor Blau -- ttaylorr --合并于提交dc8be39,2022年11月14日)

    Documentation/gitcredentials.txt:提到密码的替代方案

    签名:M Hickford
    签名:Taylor Blau

    Git asks for a "password", but the user might use a personal access token or OAuth access token instead.

    Example:

    Password for 'https://AzureDiamond@github.com':
    
    “gitcredentials”现在在其手册页面中包括以下内容:
    Git有时需要用户提供凭据才能执行操作;例如,它可能需要请求用户名和密码以便通过HTTP访问远程存储库。一些远程存储库接受个人访问令牌或OAuth访问令牌作为密码。
    本手册描述了Git用于请求这些凭据的机制,以及一些避免重复输入这些凭据的功能。
    请注意,从 Git 2.39 (2022年第四季度) 开始,凭证不仅可以被缓存,还可以被生成。
    请参见 提交记录 dabb9d8 (2022年11月12日),作者为 M Hickford (hickford)
    (由 Junio C Hamano -- gitster --提交记录 c197977 中合并,2022年11月23日)

    文档:描述凭证生成助手的工作原理

    签署者:M Hickford
    签署者:Taylor Blau

    以前的文档只描述了存储助手。

    一个具体的例子:Git Credential Manager可以通过OAuth为GitHub和GitLab生成凭据。
    https://github.com/GitCredentialManager/git-credential-manager

    gitcredentials现在在其手册页面中包括以下内容:

    由操作系统或其他程序提供的存储。或者,凭证生成助手可以通过某些API为特定服务器生成凭证。

    “gitcredentials”现在在其手册页面中包括以下内容:

    如果它不支持所请求的操作(例如,只读存储或生成器),则应该默默地忽略该请求。


    我认为\n可能是我所缺失的。密码可能已经输入了,但回车键从未按下,因此从未执行。我需要在星期一尝试一下。 - jax
    1
    使用 printf 'mypass\n' | git pull 并没有起作用。 - jax
    不确定使用的是哪个 Git 版本,但可能是存储库中最新的版本。 - jax
    我明天会告诉你确切的版本。 - jax
    我明天会尝试一下,现在我没有电脑访问权限。 - jax
    显示剩余3条评论

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接