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 用戶登錄使用

創建 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 [email protected]:~/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 生成靜態網站後進行部署。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章