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