http/https协议下免输入使用Git

在一些条件下,不方便使用ssh协议来获取、更新Git库。 实际上,也只有在少数特定的个人电脑、工作站上才适合这样做,对服务器与临时电脑都是不合适的。

使用ssh协议,需要先生成公私秘钥,并且把公钥配置到托管Git库的平台上。 准备工作比较麻烦,准备好后就很方便,适合个人电脑、工作站。

而在临时电脑,这样不仅不方便,还有安全问题。 所以,临时电脑上通常使用http/https协议来操作Git库,每次做远程操作时都需要输入账户、密码。 这样会很麻烦,但胜在安全。

在服务器上,需要脚本来自动运行时,手工输入就显得不合适了。 配置ssh密钥对于单台服务器还是可以的,但对于集群来说就不能接受。

其实,Git本身也是支持凭据存储功能的,参考《Git - 凭证存储》,解决方案就在其中。

临时电脑选cache

git config --global credential.helper cache

默认情况下,会有900秒、也就是15分钟的缓存时间。 也可以在cache后增加--timeout 1800,提升到30分钟,乃至更长时间。 相比每次远程交互都需要输入账户密码,cache要方便许多,也很安全。

服务器选store

git config --global credential.helper store

默认情况下,store会把信息明文保存在~/.git-credentials文件,大致形式如下。

$ cat ~/.git-credentials
https://USERNAME:PASSWORD@github.com

其实,这就是个带用户、密码的URL。 如果把USERNAME:PASSWORD@这个信息,写到Git库的.git/config文件中去,也可以达到相同的目的。

玩花样

store可以接受--file参数,指定文件位置。 这可以玩出两种花样。

『U盾』

[credential]
    helper = store --file /media/$USERNAME/myusb/.git-credentials
    helper = cache --timeout 1800

利用U盘(比如叫myusb)保存.git-credentials文件(当然也可以叫其它名称),即插即用。 如果没插U盘,则输入账户、密码,缓存30分钟。

是不是有一点『U盾』的感觉?

托管鉴权文件

明文保存的鉴权文件,其安全性由服务器的安全性来保障。 但是,每间隔一段时间修改一次密码,也是必要的策略。 然而,每次修改密码,就要对整个集群所有需要的用户,更新~/.git-credentials文件……想想也是一件很可怕的事!

[credential]
    helper = store --file /mnt/git/.git-credentials

.git-credentials文件,托管到某一台机器上,并且在所有机器上都mount到/mnt/git这个位置。 再加上以上配置,就可以实现鉴权文件的统一管理。


相关笔记