我正在用这样的脚本克隆 git 存储库:
git clone https://user:[email protected]/name/.git
这有效,但是我的用户名和密码!现在存储在原始 URL 中.git/config
。
我该如何防止这种情况,但仍在脚本中执行此操作(因此无需手动输入密码)?
答案1
我使用的方法是实际使用git pull
而不是克隆。脚本如下所示:
mkdir repo
cd repo
git init
git config user.email "email"
git config user.name "user"
git pull https://user:[email protected]/name/repo.git master
这不会将您的用户名或密码存储在 中.git/config
。但是,除非采取其他步骤,否则在进程运行时,从显示当前进程的命令(例如ps
)可以看到纯文本用户名和密码。
正如评论中提到的,由于此方法使用 HTTPS您必须对任何特殊字符进行 URL 编码这也可能出现在您的密码中。
我还有一个建议(如果您不能使用 ssh)是实际使用 OAuth 令牌而不是纯文本用户名/密码,因为它更安全一些。您可以从个人资料设置中生成 OAuth 令牌:https://github.com/settings/tokens。
然后使用该令牌执行拉取命令
git pull https://$OAUTH_TOKEN:[email protected]/name/repo.git master
答案2
我认为最好的解决方案是使用自定义GIT_ASKPASS
助手并将密码作为另一个环境变量提供。例如,创建一个文件git-askpass-helper.sh
如下:
#!/bin/sh
exec echo "$GIT_PASSWORD"
然后git clone https://username@hostname/repo
使用环境变量GIT_ASKPASS=/path/to/git-askpass-helper.sh
和运行GIT_PASSWORD=nuclearlaunchcodes
。
这样做的好处是密码不会在进程列表中显示。
答案3
经过许多我尝试过 SO 帖子、博客等每一个方法,这就是我想到的。它涵盖了一切。
看Git 凭证和私有包备忘单
这些都是可以安全地验证 git 以克隆存储库的方法和工具无需交互式密码提示。
- SSH 公钥
- SSH_ASKPASS
- API 访问令牌
- GIT_ASKPASS
- .gitconfig 代替
- .gitconfig [凭证]
- .git-凭据
- .netrc
- 奖励:与私人套餐一起使用
- 节点/npm 包.json
- python/pip/eggs 要求.txt
- 红宝石 Gemfile
- golang.mod 文件
无纯文本存储的最佳选择
从这里的问题来看,SSH 密钥GIT_ASKPASS
或git credential store
使用 OS Keychain 管理器可能是最佳选择。
由于 GIT_ASKPASS 可能是这三个中最难理解的,我将在这里详细介绍它 - 其他的都在备忘单中。
GIT_ASKPASS
如何创建GIT_ASKPASS
脚本:
echo 'echo $MY_GIT_TOKEN' > $HOME/.git-askpass
如何使用它:
export MY_GIT_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export GIT_ASKPASS=$HOME/.git-askpass
git clone https://[email protected]/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=
更多详细信息请参阅备忘单。
答案4
将您的令牌或密码存储在安全的地方,例如经过。
然后使用 bash 脚本将 git 映射host
到你的密码存储,例如:
#!/usr/bin/env bash
# assuming "get" action from git and a config like this
# git config --global credential.helper $XDG_BIN_HOME'/git_credentials_from_pass $@'
while IFS= read -r line
do
echo "$line"
if [[ "$line" =~ host=.*github.com.* ]]; then
echo "username=your_user_name"
echo "password=$(pass show token_github.com/your_username)"
#else ...
fi
done
更改您的设置方式your_username
。token_github.com
来源。