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