gitosis
是一套用来管理~/.ssh/authorized_keys
文件和实现简单连接限制的脚本。
客户端生产密钥并上传到服务器端:
ssh-keygen -t rsa
scp ~/.ssh/id_rsa.pub root@192.168.0.190:/tmp
Gitosis 的工作依赖于某些 Python 工具,所以首先要安装 Python 的 setuptools 包
yum install python python-setuptools
从 Gitosis 项目主页克隆并安装:
git clone git@github.com:res0nat0r/gitosis.git
#或者git clone https://github.com/res0nat0r/gitosis.git
cd gitosis
python setup.py install
创建git服务器管理用户
useradd -m git
passwd git #设置密码
chown git:git /home/git #设置权限
chmod 755 /home/git
cat /etc/passwd
#在文件末尾,你应该能找到类似这样的行:
git:x:1000:1000::/home/git:/bin/sh
#可以换成git自带的git-shell工具,把 bin/sh 改为 /usr/bin/git-shell
初始化 Gitosis
sudo -H -u git gitosis-init < /tmp/id_rsa.pub
#显示以下信息即表示成功
#Initialized empty Git repository in /home/git/repositories/gitosis-admin.git/
#Reinitialized existing Git repository in /home/git/repositories/gitosis-admin.git/
这样该公钥的拥有者就能修改用于配置 Gitosis 的那个特殊 Git 仓库了。接下来,需要手工对该仓库中的post-update
脚本加上可执行权限:
ln -s /opt/git /home/git/repositories
chmod 755 /opt/git/gitosis-admin.git/hooks/post-update
现在可以试一下用初始化 Gitosis 的公钥的拥有者身份 SSH 登录服务器,应该会看到类似下面这样:
ssh git@gitserver
//PTY allocation request failed on channel 0
//ERROR:gitosis.serve.main:Need SSH_ORIGINAL_COMMAND in //environment.
//Connection to gitserver closed.
#使用ssh 的 debug 来调试输出
ssh -v git@gitserver
说明 Gitosis 认出了该用户的身份,但由于没有运行任何 Git 命令,所以它切断了连接。那么,现在运行一个实际的 Git 命令 — 克隆 Gitosis 的控制仓库:
#在你本地计算机上
git clone git@gitserver:gitosis-admin.git
这会得到一个名为 gitosis-admin 的工作目录,主要由两部分组成:
cd gitosis-admin
find .
./gitosis.conf
./keydir
./keydir/root@CLIENT-PC.pub
gitosis.conf
文件是用来设置用户、仓库和权限的控制文件。keydir
目录则是保存所有具有访问权限用户公钥的地方— 每人一个。 Gitosis 会自动从使用gitosis-init
脚本导入的公钥尾部的描述中获取该公钥名字。
$ cat gitosis.conf
[gitosis]
[group gitosis-admin] #工作组
members = root@CLIENT-PC #工作组成员
writable = gitosis-admin #该组对gitosis-admin仓库有读写权限
测试仓库
- 测试时添加新的用户或使用其他电脑
- 添加公钥修改配置文件
- 提交gitosis仓库
#以用户root@server为例
cp ~/.ssh/id_rsa.pub ./keydir/root@server
vi gitosis.conf
#添加新的仓库
[group hello-git]
members = root@server root@CLIENT-PC
writable = hello-git
#提交仓库
git add .
git commit -m "add hello-git project"
git remote add gitosis-admin git@192.168.0.190:gitosis-admin.git
git push gitosis-admin master
在root@server上初始化库
git init
vi README
git add README
git commit -m "hello-git init"
git remote add hello-git git@192.168.0.190:hello-git.git
git push hello-git master
在gitosis.conf
文件已经添加root@CLIENT-PC
用户访问hello-git
仓库权限
git clone git@192.168.0.190:hello-git.git
遇见的一些问题:
- ~/.ssh/id_rsa.pub。由于客户端是用一台电脑做测试,在测试hello-git仓库时
,没有创建新的用户就使用ssh-keygen生成公钥和私钥,管理gitosis-git的公钥
被替换成新的id_rsa.pub,连gitosis-git仓库都登不上去。添加新的用户或用其他电脑测试。 - gitosis.conf的用户名和keydir的公钥名不对应。公钥没有
.pub
后缀,root@server公钥 => root@server.pub
fatal: 'hello-git.git' does not appear to be a git repository
fatal: Could not read from remote repository.
- 用户权限问题。提交时出现
IOError: [Errno 13] Permission denied: /home/git/gitosis/projects.list.
错误
chown -R git /home/git/gitosis #更改文件或目录所属的用户
chgrp -R git /home/git/gitosis #更改文件或目录所属的组