centos下搭建git服务 & 基于git服务配置自动化部署 & 遇到的Linux知识补充

安装 git

su root
yum install -y git

添加 git 用户,用于管理/使用 git 服务/仓库

建立用户 git

# 添加名为git的用户, 而且会默认建立一个名为git的用户组
useradd git

# or 建立一个用户组
# groupadd group-git
# 在建立git用户的同时把git拉进group-git用户组, 此时也会建立一个名为git的用户组
# useradd -G group-git git

# 使用 passwd 命令为新建用户设置密码, 没有设置密码的用户不能使用
passwd git

至此用户建立完成,/home 下也能够看到新建了 git 的文件夹专门给 git 用户登陆使用html

建立 git 空仓库

# 进入git用户的文件夹
cd /home/git
# 在根目录下建立blog.git文件夹
mkdir blog.git
cd blog.git
# 初始化一个空仓库
git init --bare
git init --bare 是在当前目录建立一个裸仓库,也就是说没有工做区的文件,直接把 git 仓库隐藏的文件放在当前目录下,此目录仅用于存储仓库的历史版本等数据。

文件/文件夹的操做权限配置

客户端经过 remote/clone 进行链接远程仓库测试。linux

git clone git@ipAddress:blog.git

输入 git 的用户密码后能够正常克隆下来,可是在 push 的时候出现了错误。git

remote: error: insufficient permission for adding an object to repository database ./objects

意思是 git/blog.git 这个文件夹没有权限写入。这时回到服务器进入 git 文件夹, 查看文件(夹)详情 👇shell

ls -l

图片描述

发现 blog.git 的拥有者是 root 用户(当时在服务器是以 root 用户建立的 blog.git), 而咱们 git bash 用的是 git 用户进行提交, 根据截图所示文件拥有者(此处是 root 用户)之外的用户是没有写入权限的。那么咱们就能够把该文件的所属组设置为 git 群组(git 用户所在群组), 并把所属组的操做权限增长 w; 或者直接把拥有者更改成 git 用户。vim

chgrp -R git blog.git
chmod -R 770 blog.git
# or
# chown -R git blog.git

顺便看下截图所展现的信息分别是什么 👇windows

ls -l 信息详解

第 1 列: drwxr-xr-x

文件的类型和文件权限bash


第 1 个字符 d 表明的是文件类型服务器

文件类型分为以下几类hexo

d :目录
- :文件
l :连接
s :socket
p :named pipe
b :block device
c :character device

剩下的 9 个字符分别以 3 个字符为一组表明文件拥有者/文件所属组/文件拥有者之外的用户所具有的操做权限ssh

r :可读 - 表明此权限的数字为 4
w :可写 - 表明此权限的数字为 2
x :可执行 - 表明此权限的数字为 1
- :无此(读/写/执行)权限 - 表明的数字为 0
拥有者 所属组 其余用户 权限数
rwx r-x r-x 755
rwx rwx rwx 777

改变文件的权限 chmod 权限数 文件名/目录名
改变文件的所属组 chgrp 组名 文件名/目录名
改变文件的拥有者 chown 帐号名称 文件名/目录名
同时改变文件的拥有者和所属组 chown 帐号名称:组名 文件名/目录名

若是须要将目录下的全部文件都改变其拥有者/所属组,可使用 -R 参数(recursive 递归循环)。

第 2 列: 7

文件硬连接数或目录子目录数

传送门: linux 硬连接与软连接
备用连接

一个空目录的该字段是 2,表示该目录下有两个子目录,由于每个目录都有一个指向它自己的子目录"." 和指向它上级目录的子目录".."
剩下的 3-7 列
root root 119 Aug 5 18:33 blog.git
文件的拥有者 文件的所属群组 文件的大小 文件最后更新(修改)时间 文件名

禁止 git 用户经过 shell 登陆

git 用户建立完成后其实是能够在客户端经过 shell 登陆 Linux 的,这样就能够经过 bash 命令来操做服务器了,咱们不须要 git 用户有这样的权限。那么就须要修改 git 用户的登录 shell,如下摘自 git 官网

须要注意的是,目前全部(得到受权的)开发者用户都能以系统用户 git 的身份登陆服务器从而得到一个普通 shell。 若是你想对此加以限制,则须要修改 passwd 文件中(git 用户所对应)的 shell 值。

借助一个名为 git-shell 的受限 shell 工具,你能够方便地将用户 git 的活动限制在与 Git 相关的范围内。该工具随 Git 软件包一同提供。 若是将 git-shell 设置为用户 git 的登陆 shell(login shell),那么用户 git 便不能得到此服务器的普通 shell 访问权限。 若要使用 git-shell,须要用它替换掉 bash 或 csh,使其成为系统用户的登陆 shell。 为进行上述操做,首先你必须确保 git-shell 已存在于 /etc/shells 文件中。(通常状况都存在,该工具随 Git 软件包一同提供)


root 用户下输入:vim /etc/passwd
修改 git 用户的登陆 shell
git1001:1002::/home/git:/bin/bash -> git1001:1002::/home/git:/bin/git-shell


而后咱们切换成 git 用户会报错, 若是用 git 用户登陆 shell 会自动关闭终端

fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.

意思是家目录下应该存在一个叫 git-shell-commands 的文件夹,而且 git 用户需拥有读和执行的权限,这个文件夹是用于存放 git 用户登录后能够执行的命令(git-shell 的命令)


git-shell-commands

接下来咱们用 root 用户建立 git-shell-commands 的文件夹并写一个可执行脚本 test

cd /home/git
mkdir git-shell-commands
cd git-shell-commands
touch test
vim test

test 的内容以下

#!/bin/sh
echo 'test'

接着切换 git 用户或者用 git 用户登陆,没有异常,并显示

git >

输入 test 测试下

这就是 git-shell 的交互式运行,若是想禁用交互式运行,可参考 👇

若是~/git-shell-commands 目录存在,git shell 也能够交互式运行(不带参数)。若是 git-shell-commands 目录中存在命令 help,则会向用户提供容许的操做概述。而后出现一个“git>”提示符,用户能够输入 git-shell-commands 目录中的任何命令或 exit 关闭链接。
一般,此模式用做管理界面,以容许用户列出他们有权访问的存储库,建立,删除或重命名存储库,或更改存储库描述和权限。
若是 no-interactive-login 命令存在,则运行它并交互式 shell 被停止。

ssh 实现公钥登陆

经过 ssh 协议登陆服务器的方式

密码口令登陆

经过密码进行登陆,主要流程为:
一、客户端链接上服务器以后,服务器把本身的公钥传给客户端
二、客户端输入服务器密码经过公钥加密以后传给服务器
三、服务器根据本身的私钥解密登陆密码,若是正确那么就让客户端登陆

公钥登陆

公钥登陆是为了解决每次登陆服务器都要输入密码的问题,流行使用 RSA 加密方案,主要流程包含:
一、客户端生成 RSA 公钥和私钥
二、客户端将本身的公钥存放到服务器
三、客户端请求链接服务器,服务器将一个随机字符串发送给客户端
四、客户端根据本身的私钥加密这个随机字符串以后再发送给服务器
五、服务器接受到加密后的字符串以后用公钥解密,若是正确就让客户端登陆,不然拒绝。这样就不用使用密码了

咱们以前都是客户端经过密码口令方式登陆服务器的,接下来讲下公钥登陆的方式,否则每次都要输入密码口令就很麻烦了。

客户端(windows 为例)生成公钥和私钥并把公钥上传至服务器

一、生成公钥和私钥

ssh-keygen -t rsa -C "working place"

一路回车后会在家目录下生成.ssh 文件夹,里面的 id_rsa.pub 就是要上传给服务器的公钥。

二、上传公钥至服务器

使用 scp 把公钥上传至服务器

scp id_rsa.pub username@server.com:~/sshPub/workPub

以上,完成客户端的操做。

服务端生成公钥和私钥,并添加客户端的公钥进受权(authorized_keys)

一、生成公私钥

# 以git用户执行生成
sudo -u git ssh-keygen -t rsa -C "hans-server"

二、添加客户端的公钥进 authorized_keys

# 把左边的文件内容写进右边的文件,从右边文件的最后一行开始添加,若右边的文件不存在则先建立
cat /home/upload-username/sshPub/workPub >> /home/git/.ssh/authorized_keys

三、完成。在客户端上进行测试实现公钥免密登陆。

基于 git 服务配置自动化部署

利用 git 服务器端钩子 post-receive

post-receive 挂钩在客户端整个推送过程完结之后运行,能够用来更新其余系统服务或者通知用户。

注:个人 git 服务器就是须要部署的目标服务器


首先在服务器上拉取须要的 git 仓库

cd /home/git/repo/blog
git clone /home/git/blog.git

而后去修改仓库对应的 git 服务的钩子

cd /home/git/blog.git/hooks
vim post-receive

文件内容以下 👇

cd /home/git/repo/blog
unset GIT_DIR
printf "\033[40;36mStart pulling...\033[0m\n"
git pull
printf "\033[40;36mStart generating...\033[0m\n"
hexo clean
hexo g
printf "\033[40;36mStart deploying...\033[0m\n"
rm -rf /home/git/server/blog/public
mv public /home/git/server/blog
printf "\033[40;32mAll done!\033[0m\n"

可让服务器的仓库进行拉取更新而后作一些列的部署活动,我这里是利用 hexo 生成静态网站后进行部署。

相关文章
相关标签/搜索