... Rei ...
... cjlmonster@163.com ...
... 白开水与方便面 ...
... Rei ...
... cjlmonster@163.com ...
... 白开水与方便面 ...
2021-06-17 约 376 字 预计阅读 2 分钟 Git
gitosis 是一个用Python写的git权限管理工具,可以用来管理开发团队,比如为一个项目分配开发人员,即一个仓库的可访问操作人员,或者简单的控制某些用户对某个仓库只有可读权限,即只能查看或拷贝,但不能修改。下面,接着上篇的 自定义git服务器 开始讲。ps: git服务器是 Linux Mint 虚拟机,ip是 192.168.2.178
上一篇我们讲到 配置 git用户免密码登录时,往 .ssh/authorized_keys 这个文件里添加需要参与到项目管理的用户的公钥进来,往后这些用户就可以通过git用户拷贝项目到本地进行开发了,现在我们用 gitosis 来管理用户的公钥,将 .ssh/authorized_keys 文件交给 gitosis 管理。
先把旧的 .ssh/authorized_keys 给删除掉,或备份起来,因为初始化 gitosis 会重新创建 .ssh/authorized_keys 文件
$ sudo mv .ssh/authorized_keys .ssh/authorized_keys.bak
然后将 git用户的登录shell改回来,即改成/bin/bash
,让其具有登录权限
$ sudo usermod -s /bin/bash git
$ cat /etc/passwd
接着用root用户登录并切换到root家目录,安装 gitosis一定要用 root用户,否则安装失败
$ sudo su -
拷贝 gitosis 到root用户的家目录下
$ git clone https://github.com/res0nat0r/gitosis
进入刚刚拷贝的 gitosis 目录里,然后使用 Python 安装 gitosis(注意:一定要进入 gitosis 目录再执行Python安装命令,还有就是一定要使用Python2来执行,不能用Python3,否则安装失败)
$ python2 setup.py install
拷贝本地的公钥到服务器来,假设拷贝到临时目录/tmp
,其中 192.168.2.178
为服务器地址
$ scp ~/.ssh/id_rsa.pub git@192.168.2.178:/tmp
切回 git 用户登录,然后用刚刚上传的公钥初始化 gitosis
#####切换 git用户并回到 git用户家目录#####
$ su - git#######初始化 gitosis#########
$ gitosis-init < /tmp/id_rsa.pub
可以看到git家目录里,自动生成了一些文件,其中 repositories 是用来存放仓库的,往后新建的仓库都放这里, .gitosis.conf 文件链接到了管理员仓库 gitosis-admin.git 的 gitosis.conf 配置文件,管理员修改 gitosis.conf 文件后会反映到 .gitosis.conf 文件里 查看 repositories ,可以看到里面已经有一个仓库 gitosis-admin.git,这个仓库就是gitosis用来管理其它仓库的,刚刚初始化用的 公钥 就是管理员,其可以修改这个仓库,设置用户等权限 切换回 root 用户,然后查看 gitosis-admin.git 仓库的钩子脚本是否可执行
$ cd gitosis-admin.git/hooks
$ ll
修改 gitosis-admin.git 仓库的钩子脚本可执行,否则 gitosis 不能完成自动化操作
$ chmod a+x post-update
$ ll
至此,gitosis 安装并初始化完成,下面说说使用
上面安装完后,在git用户的家目录里生成如下文件:
同时,使用上传的公钥初始化后,会自动生成 .ssh/authorized_keys 文件,里面已经自动保存了初始化时用的公钥 查看 .ssh/authorized_keys 文件 可以看到,这是 gitosis 自动生成的,不能手动修改,往后上传的其他用户的公钥都会由 gitosis 自动保存到这,即由gitosis管理公钥,接着尝试使用git用户登录
$ ssh git@192.168.2.178
出现上图提示,说明 gitosis 认出了该用户的身份,但由于没有运行任何 Git 命令所以它切断了连接。
上传公钥到服务器端初始化gitosis的本地电脑,此时被服务器设为gitosis的管理员,有权限读写 gitosis-admin.git 仓库,拷贝 gitosis-admin.git 仓库到本地
$ git clone git@192.168.2.178:gitosis-admin.git
可以看到, 通过 gitosis 管理的仓库,ssh地址直接用仓库名就可以了,前面不用加 repositories,进入 gitosis-admin,查看
$ cd gitosis-admin
$ ll
里面有一个配置文件和一个用于存放公钥的文件夹
username.pub
,username用户电脑的别名,每个用户都是唯一的gitosis管理员通过上传需要参与开发的人员的电脑的公钥到 gitosis-admin/keydir里,然后在 gitosis.conf 文件里配置开发人员对相应仓库的控制权限,修改完后,提交并同步到服务器,就完成了gitosis的一次配置
默认情况下,gitosis初始化后,便会把初始化用的公钥存到 keydir里了 且会在gitosis.conf里配置好这个公钥对应用户的权限,即对 gitosis-admin.git 有修改权限
$ cat gitosis.conf
解释 gitosis.conf 配置文件:
[group groupname]
,groupname,组名,如上面设为 gitosis-admin,这里其实就是管理员组了members = username1 username2 ...
,这里设置了一个成员 Android2@Android2-PC,多个成员以空格间隔,成员的名字是对应 keydir 文件夹存放的公钥的名字的,假如公钥存放的名字设为 developer1.pub,则配置文件里,配置成员时,就要用 developer1 这个名字权限 = 仓库名1 仓库名2 ...
,这里权限为writable
,即对仓库的权限为可读写,gitosis-admin
为仓库名,管理多个仓库,仓库名用空格隔开
模拟开发,在服务端用 git用户创建一个新的仓库 sample.git 放到 repositories 里 假设有三个用户共同开发 sample.git 这个项目,分别是:developer1, developer2和developer3,其中developer1, developer2对仓库有读写权限,developer3只有读取权限,不能修改仓库,条件有限,这里用 ssh-keygen 命令在本机上分别生成这三个用户的公私钥(正式环境下是,三个用户分别对应三台电脑,每台电脑通过 ssh-keygen 命令生成各自的公私钥,然后把公钥发给 gitosis管理员保存和配置项目权限,私钥自己保存)
首先在 c盘里新建 keys 文件夹 ,然后在里面新建 developer1, developer2和developer3 三个文件夹,分别保存三个用户的公私钥
$ ssh-keygen -t rsa -C “developer1” -f /c/keys/developer1/id_rsa
$ ssh-keygen -t rsa -C “developer2” -f /c/keys/developer2/id_rsa
$ ssh-keygen -t rsa -C “developer3” -f /c/keys/developer3/id_rsa
上面生成命令一路回车就可以 然后将各自的公钥复制到 keydir 文件夹里,并分别重新命名为 developer1.pub, developer2.pub和developer3.pub
$ cp /c/keys/developer1/id_rsa.pub developer1.pub
$ cp /c/keys/developer2/id_rsa.pub developer2.pub
$ cp /c/keys/developer3/id_rsa.pub developer3.pub
接着修改 gitosis.conf 文件
$ vim gitosis.conf
可以看到,添加了两个用户组,sample-developer 和 sample-custom,其中 sample-developer 为开发者群,可以修改sample仓库,sample-custom 为只读群组,智能拷贝和查看 sample仓库,不能修改,这里我把管理员Android2@Android2-PC
也添加进 sample-custom 了,等下用来测试只读权限
最后提交更改并更新到服务器
$ git add -A
$ git commit -m “添加sample项目开发组”
$ git push origin master
服务器查看 gitosis-admin.git 仓库的提交日志,可以看到提交日志已经有了 查看 .gitosis.conf 文件,可以看到修改的配置已更新上来了 查看 .ssh/authorized_keys,可以看到三个开发者的公钥已经保存到这里了
上面把管理员Android2@Android2-PC
添加进 sample-custom 了,这个组对 sample.git 仓库的权限为只读,下面拷贝下来,测试下修改
$ git clone git@192.168.2.178:sample.git
可以看到是可以拷贝查看的,接着修改看看
$ cd sample
$ echo “test edit” > test.txt
$ git add -A
$ git commit -m “添加文件”
$ git push origin master
可以看到,在本地上添加修改提交都可以,但更新到服务器时就报错了,提示该仓库没有写的权限
主题色
主色
强调色