最近由于准备在公司的服务器上面搭建静态博客(Hexo),然后需要先搭建一个 git 服务器作为转接,整个过程看似顺利,十几分钟就搭建完成,不过最后在验证这块卡了两个小时,在此记录下来,供准备搭建 git 服务器的新手小伙伴们借鉴。
# 搭建 git 服务器
通过 ssh 链接到服务器,开始进行操作
# 第一步
在服务器上安装 git
$ sudo apt-get install git |
# 第二步
创建 git 用户,用来运行 git 服务
$ sudo adduser git |
# 第三步
创建证书,免密码登录:
收集所有需要登录的用户的公钥( id_rsa.pub
)文件,把所有公钥导入到 /home/git/.ssh/authorized_keys
文件内,一行一个。
如果个人的 git 中的公钥已经连接了其他服务器如:github,可以参考 Post not found: 一个客户端设置多个github账号
注意:一定要通过下面的命令将该文件其他用户的所有权限移除,否则会出现文章尾部问题
$ chmod 600 authorized_keys |
# 第四步
初始化 git 仓库
$ git init --bare test.git |
git 创建一个裸仓库,裸仓库没有工作区,因为服务器上的 git 仓库纯粹为了共享,所有不能让用户直接登录到服务器上去改工作区,并且服务器的 git 仓库通常以 .git
结尾。然后,修改 owner 改为 git:
$ sudo chown -R git:git test.git |
# 第五步
禁用 shell 登录:
处于安全的考虑,第二步创建的 git 用户不允许登录 shell,这可以通过编辑 /etc/passwd
文件完成。
git:x:1003:1003::/home/git:/bin/bash |
改为
git:x:1003:1003::/home/git:/usr/bin/git-shell |
这样,git 用户可以正常通过 ssh 使用 git,但无法登录 shell,因为我们为 git 用户指定的 git-shell 每次一登录就自动退出。
# 第六步
克隆远程仓库:
现在,可以通过 git clone 命令克隆远程仓库了,在各自的电脑上运行:
$ git clone git@server:/home/git/test.git |
如果服务器的 ssh 端口不是默认的 22 的话,比如说 6789,可以这样写:
$ git clone ssh://git@server:6789/home/git/test.git |
# 问题来了
本来根据文档,根据广大猿友的经验,我的搭建之路已经完成了,然后最后一步出现了问题。每次跟服务器进行交互 (clone,pull,push),都让我输入 git 的密码,也就是说,我配置的 ssh 没有生效。然后就开始到处找原因,重新生成 rsa,提升 authorized_keys 权限,重新创建服务器 git 账户,重新。。。。。
翻遍了 Stack Overflow 和 segmentfault , 两个小时过去了,问题仍然没有进展,这么简单的东西,问题到底出在哪里。
就在心灰意冷,准备放弃的时候,不知道是哪里来的灵感,准备把 authorized_keys 文件的其他用户的权限删掉,然后就能用了,后就能用了,就能用了,能用了,用了,了~~~~,命令如下,不想多说话,我想静静。
$ chmod 600 authorized_keys |