安装 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 生成静态网站后进行部署。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。