su root yum install -y 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用户的文件夹 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
文件的类型和文件权限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 递归循环)。
文件硬连接数或目录子目录数
传送门: linux 硬连接与软连接
备用连接
一个空目录的该字段是 2,表示该目录下有两个子目录,由于每个目录都有一个指向它自己的子目录"." 和指向它上级目录的子目录".."
root | root | 119 | Aug 5 18:33 | blog.git |
---|---|---|---|---|
文件的拥有者 | 文件的所属群组 | 文件的大小 | 文件最后更新(修改)时间 | 文件名 |
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 的命令)
接下来咱们用 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 被停止。
经过密码进行登陆,主要流程为:
一、客户端链接上服务器以后,服务器把本身的公钥传给客户端
二、客户端输入服务器密码经过公钥加密以后传给服务器
三、服务器根据本身的私钥解密登陆密码,若是正确那么就让客户端登陆
公钥登陆是为了解决每次登陆服务器都要输入密码的问题,流行使用 RSA 加密方案,主要流程包含:
一、客户端生成 RSA 公钥和私钥
二、客户端将本身的公钥存放到服务器
三、客户端请求链接服务器,服务器将一个随机字符串发送给客户端
四、客户端根据本身的私钥加密这个随机字符串以后再发送给服务器
五、服务器接受到加密后的字符串以后用公钥解密,若是正确就让客户端登陆,不然拒绝。这样就不用使用密码了
咱们以前都是客户端经过密码口令方式登陆服务器的,接下来讲下公钥登陆的方式,否则每次都要输入密码口令就很麻烦了。
一、生成公钥和私钥
ssh-keygen -t rsa -C "working place"
一路回车后会在家目录下生成.ssh 文件夹,里面的 id_rsa.pub 就是要上传给服务器的公钥。
二、上传公钥至服务器
使用 scp 把公钥上传至服务器
scp id_rsa.pub username@server.com:~/sshPub/workPub
以上,完成客户端的操做。
一、生成公私钥
# 以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 服务器端钩子 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 生成静态网站后进行部署。