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 生成靜態網站後進行部署。

相關文章
相關標籤/搜索