安装 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 用户登录使用

创建 git 空仓库

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

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

客户端通过 remote/clone 进行连接远程仓库测试。

git clone git@ipAddress:blog.git

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

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

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

ls -l

图片描述

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

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

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

ls -l 信息详解

第 1 列: drwxr-xr-x

文件的类型和文件权限


第 1 个字符 d 代表的是文件类型

文件类型分为如下几类

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

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

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 协议登录服务器的方式

密码口令登录

通过密码进行登录,主要流程为:
1、客户端连接上服务器之后,服务器把自己的公钥传给客户端
2、客户端输入服务器密码通过公钥加密之后传给服务器
3、服务器根据自己的私钥解密登录密码,如果正确那么就让客户端登录

公钥登录

公钥登录是为了解决每次登录服务器都要输入密码的问题,流行使用 RSA 加密方案,主要流程包含:
1、客户端生成 RSA 公钥和私钥
2、客户端将自己的公钥存放到服务器
3、客户端请求连接服务器,服务器将一个随机字符串发送给客户端
4、客户端根据自己的私钥加密这个随机字符串之后再发送给服务器
5、服务器接受到加密后的字符串之后用公钥解密,如果正确就让客户端登录,否则拒绝。这样就不用使用密码了

我们之前都是客户端通过密码口令方式登录服务器的,接下来说下公钥登录的方式,不然每次都要输入密码口令就很麻烦了。

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

1、生成公钥和私钥

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

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

2、上传公钥至服务器

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

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

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

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

1、生成公私钥

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

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

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

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

基于 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 生成静态网站后进行部署。


AwesomeHan
125 声望4 粉丝