CentOS搭建Git服務(wù)器及權(quán)限管理

聲明:本教程,僅作為配置的記錄,細(xì)節(jié)不展開,需要您有一點(diǎn)linux的命令基礎(chǔ),僅作為配置參考。

1. 系統(tǒng)環(huán)境

系統(tǒng): Linux:CentOS 7.2 64位

由于CentOS已經(jīng)內(nèi)置了OpenSSH,如果您的系統(tǒng)沒有,請(qǐng)自行安裝。

查看ssh版本

$ ssh -V

# 輸出以下表示沒問題,可以繼續(xù)。 版本可能不一致,能用即可。
OpenSSH_6.6.1p1, OpenSSL 1.0.1e-fips 11 Feb 2013

避免系統(tǒng)環(huán)境和其他的不一致,請(qǐng)核對(duì)您系統(tǒng)的版本,其他發(fā)行版請(qǐng)對(duì)應(yīng)修改。

2. 安裝git

建議以下操作都切換到root

# 請(qǐng)確保您切換到了root賬戶
$ su root
$ yum install -y git

# 驗(yàn)證是否安裝成功
$ git --version

# 輸出如下內(nèi)容表示成功:
git version x.x.x.x

3. 添加git的管理的賬戶和設(shè)置密碼

設(shè)置專門管理git的賬號(hào)非必須,但是建議這么操作。

# 添加git賬戶
$ adduser git

# 修改git的密碼
$ passwd git

# 然后兩次輸入git的密碼確認(rèn)后。

# 查看git是否安裝成功
$ cd /home && ls -al
# 如果已經(jīng)有了git,那么表示成,參考如下:
drwxr-xr-x.  5 root root 4096 Apr  4 15:03 .
dr-xr-xr-x. 19 root root 4096 Apr  4 15:05 ..
drwx------  10 git  git  4096 Apr  4 00:26 git

# 默認(rèn)還給我們分配一個(gè)名字叫g(shù)it的組。

4. git的權(quán)限管理

git倉(cāng)庫(kù)的權(quán)限管理,我們可以手動(dòng)進(jìn)行管理和配置,也可以通過其他輔助工具。如果小團(tuán)隊(duì)的話,直接通過ssh公鑰進(jìn)行管理即可,如果大點(diǎn)的團(tuán)隊(duì),最好用gitolite 或者 gitosis,兩者都差不多,一個(gè)是Perl開發(fā),一個(gè)是Python開發(fā)。

以下我分別介紹手動(dòng)管理權(quán)限和使用gitolite管理的方式,注意兩者不兼容,不能混用。

5. git的手動(dòng)權(quán)限管理

經(jīng)過以上步驟,其實(shí)服務(wù)器的基本已經(jīng)配置好,但是需要設(shè)置權(quán)限和配置遠(yuǎn)程訪問git倉(cāng)庫(kù)的方式。我們只介紹ssh的方式,https不做介紹。

5.1 配置服務(wù)端的ssh訪問

切換到git賬號(hào),并創(chuàng)建ssh的默認(rèn)目錄和校驗(yàn)公鑰的配置文件

# 1.切換到git賬號(hào)
$ su git

# 2.進(jìn)入 git賬戶的主目錄
$ cd /home/git

# 3.創(chuàng)建.ssh的配置,如果此文件夾已經(jīng)存在請(qǐng)忽略此步。
$ mkdir .ssh

# 4. 進(jìn)入剛創(chuàng)建的.ssh目錄并創(chuàng)建authorized_keys文件,此文件存放客戶端遠(yuǎn)程訪問的 ssh的公鑰。
$ cd /home/git/.ssh
$ touch authorized_keys

# 5. 設(shè)置權(quán)限,此步驟不能省略,而且權(quán)限值也不要改,不然會(huì)報(bào)錯(cuò)。
$ chmod 700 /home/git/.ssh/
$ chmod 600 /home/git/.ssh/authorized_keys

此時(shí),服務(wù)端的配置基本完成。接下需要把客戶端的公鑰拷貝到authorized_keys文件中。

5.2 配置客戶端的ssh私鑰并上傳服務(wù)器

以下是客戶端創(chuàng)建ssh私鑰和拷貝的過程,如果您有私鑰越過創(chuàng)建私鑰的過程。

請(qǐng)用您的客戶端進(jìn)入終端(如果只有一臺(tái)電腦,可以用不同的賬號(hào)模擬不同客戶端)

第一步: 創(chuàng)建客戶端的ssh私鑰和公鑰

檢查是否已經(jīng)擁有ssh公鑰和私鑰:進(jìn)入用戶的主目錄。

用戶主目錄:
Windows系統(tǒng):C:\Users\用戶名
Linux系統(tǒng):/home/用戶名
Mac系統(tǒng):/Users/用戶名

然后查看是否有.ssh文件夾,此文件夾下是否有如下幾個(gè)文件。

# 用戶主目錄的.ssh文件夾下
.ssh
├── id_rsa
└── id_rsa.pub  # 我們要用的私鑰

如果沒有,那么用ssh-keygen創(chuàng)建ssh的私鑰。

$ ssh-keygen -t rsa

# 接下來(lái),三個(gè)回車默認(rèn)即可。

創(chuàng)建私鑰成功后,在查看用戶目錄是否有意加有了公鑰文件id_rsa.pub

第二步: 拷貝私鑰到git的服務(wù)器

如何把客戶端的文件拷貝到服務(wù)器端,我建議用scp命令進(jìn)行拷貝。

以下以mac系統(tǒng)為例:

# 首先進(jìn)入我的用戶主目錄的.ssh目錄下,注意用戶名xxx替換成自己的
$ cd /Users/xxx/.ssh

# 以下命令是:把本地的id_rsa.pub文件拷貝到 aicoder.com服務(wù)器,登錄aicoder.com服務(wù)的賬號(hào)是git。
# 冒號(hào)后面默認(rèn)就是git賬號(hào)的主目錄,最后文件被保存成laoma.pub
# 注意:把域名換成你自己的或者ip,最后的文件名可以自己定,后面還有用。
$ scp ./id_rsa.pub git@aicoder.com:.ssh/laoma.pub

5.3 服務(wù)器端添加客戶端的SSH公鑰

切換到服務(wù)器端,把剛才上傳的laoma.pub文件的內(nèi)容添加到 authorized_keys中,就可以允許客戶端ssh訪問了。

# 切換到git賬戶
$ su git
$ cd /home/git/.ssh

$ ls -al
# 查看一下.ssh目錄是否有authorized_keys和laoma.pub文件
# .
# |-- authorized_keys
# `-- laoma.pub

# 如果有,那么進(jìn)行下面的把laoma.pub文件中的內(nèi)容添加到authorized_keys中.
$ cat laoma.pub >> authorized_keys

# >> 是在文件后面追加的意思,主要如果用其他編輯器,每個(gè)ssh的pub要單獨(dú)一行,建議用cat命令方便簡(jiǎn)單。

到此為止,您配置的客戶端應(yīng)該可以ssh的方式直接用git賬號(hào)登錄服務(wù)器。(當(dāng)然不安全,后面可以控制)

# 在客戶端用ssh測(cè)試連接遠(yuǎn)程服務(wù)器,請(qǐng)將域名aicoder.com換成你的ip地址或者域名
$ ssh git@aicoder.com    

# 第一次連接有警告,輸入yes繼續(xù)即可。如果可以連接上,那么恭喜你的ssh配置已經(jīng)可以了。 

5.4 服務(wù)器端創(chuàng)建測(cè)試git倉(cāng)庫(kù)

進(jìn)入服務(wù)器的終端。

# 切換到git賬號(hào)
$ su git

# 進(jìn)入git賬號(hào)的用戶主目錄。
$ cd /home/git

# 在用戶主目錄下創(chuàng)建 test.git倉(cāng)庫(kù)的文件夾
$ mkdir test.git  && cd test.git

# 在test.git目錄下初始化git倉(cāng)庫(kù)
$ git init --bare

# 輸出如下內(nèi)容,表示成功
Initialized empty Git repository in /home/git/test.git/

git init --bare 是在當(dāng)前目錄創(chuàng)建一個(gè)裸倉(cāng)庫(kù),也就是說沒有工作區(qū)的文件,直接把git倉(cāng)庫(kù)隱藏的文件放在當(dāng)前目錄下,此目錄僅用于存儲(chǔ)倉(cāng)庫(kù)的歷史版本等數(shù)據(jù)。

此時(shí),客戶端就可以進(jìn)行clone或者remote add此倉(cāng)庫(kù)了。

5.5 客戶端測(cè)試連接git遠(yuǎn)程倉(cāng)庫(kù)

客戶端,可以新建一個(gè)文件夾,初始化一個(gè)倉(cāng)庫(kù),然后跟遠(yuǎn)程服務(wù)器上的空倉(cāng)庫(kù)建立連接。

# 以下shell代碼,純手寫沒有驗(yàn)證,如果有錯(cuò)誤請(qǐng)自行糾正。
$ mkdir demos && cd demos
$ git init
$ touch a.txt
$ echo 'aicoder.com' >> a.txt
$ git add .
$ git commit -m 'the first commit'

# 把當(dāng)前倉(cāng)庫(kù)跟遠(yuǎn)程倉(cāng)庫(kù)添映射
$ git remote add origin git@aicoder.com:test.git

# 把當(dāng)前倉(cāng)庫(kù)push到遠(yuǎn)程倉(cāng)庫(kù)。
$ git push -u origin master

到此為止,我們就可以盡情的享用git私服了,但是!但是!但是!客戶端可以直接ssh登錄啊,這是bug,也是不安全的隱患,且看下面怎么禁用git賬號(hào)的shell登錄。

5.6 禁止客戶端shell登錄

因?yàn)榍懊嫖覀兲砑恿丝蛻舳说膕sh的公鑰到遠(yuǎn)程服務(wù)器,所以客戶端可以直接通過shell遠(yuǎn)程登錄服務(wù)器,這不安全,也不是我們想要的。且看下面如何禁用shell登錄:

第一步:
/home/git 下面創(chuàng)建git-shell-commands目錄,并把目錄的擁有者設(shè)置為git賬戶??梢灾苯佑胓it賬號(hào)登錄服務(wù)器終端操作。

$ su git
$ mkdir /home/git/git-shell-commands

此文件夾是git-shell用到的目錄,需要我們手動(dòng)創(chuàng)建,不然報(bào)錯(cuò):fatal: Interactive git shell is not enabled. hint: ~/git-shell-commands should exist and have read and execute access.

第二步:修改/etc/passwd文件,修改

$ vim /etc/passwd

# 可以通過 vim的正則搜索快速定位到這行,  命名模式下  :/git:x

# 找到這句, 注意1000可能是別的數(shù)字
git:x:1000:1000::/home/git:/bin/bash

# 改為:
git:x:1000:1000::/home/git:/bin/git-shell

# 最好不要直接改,可以先復(fù)制一行,然后注釋掉一行,修改一行,保留原始的,這就是經(jīng)驗(yàn)?。?!
# vim快捷鍵: 命令模式下:yy復(fù)制行, p 粘貼  0光標(biāo)到行首 $到行尾 x刪除一個(gè)字符  i進(jìn)入插入模式 
# 修改完后退出保存:  esc進(jìn)入命令模式, 輸入::wq!   保存退出。

好了,此時(shí)我們就不用擔(dān)心客戶端通過shell登錄,只允許使用git-shell進(jìn)行管理git的倉(cāng)庫(kù)。

如果有其他小伙伴要連接git服務(wù)器,僅需要把他的公鑰也添加到authorized_keys即可。

7. git的自動(dòng)權(quán)限管理:gitolite(不要跟上面的步驟混做!?。。?/h2>

如果團(tuán)隊(duì)大點(diǎn)的,我們可以用gitolite管理,而且使用很方便。

7.1 gitolite的安裝和配置

以下配置此承接第5,如果第6步您已經(jīng)操作,請(qǐng)注意第二步的說明。

第一步:添加gitolite依賴的perl的包

$ yum install 'perl(Data::Dumper)' 

第二步:清空服務(wù)器端配置的ssh的公鑰

確保:/home/git/.ssh/authorized_keys文件是空的,或者不存在。如果已經(jīng)存在,建議你把他改名即可,比如:authorized_keys.bak

第三步:上傳管理員的客戶端的ssh公鑰到服務(wù)器

把你管理員電腦的ssh的id_rsa.pub文件拷貝到服務(wù)器的: $HOME/YourName.pub

YourName可以自定義,最好根據(jù)不同伙伴的名字命名。

參考:

# mac客戶端
$ scp /Users/fly/.ssh/id_rsa.pub git@aicoder.com:malun.pub

第四步:安裝配置gitolite

用git賬號(hào)登錄,并執(zhí)行如下命令。

# 切換到git賬號(hào)
$ su git

# 進(jìn)入git主目錄
$ cd /home/git

# 下載gitolite的倉(cāng)庫(kù)
$ git clone https://github.com/sitaramc/gitolite

# 創(chuàng)建bin文件夾,必須?。。?$ mkdir -p $HOME/bin

# 用下載下來(lái)的倉(cāng)庫(kù)中的insall執(zhí)行安裝操作,指向的目錄就是上一命令行創(chuàng)建的目錄
$ ./gitolite二進(jìn)制/install -to $HOME/bin

# 把上傳到服務(wù)器的 管理員的公鑰setup到gitolite中,注意:YourName.pub改成你自己的文件名。
$ ~/bin/gitolite setup -pk ~/YourName.pub

# 此時(shí)安裝配完成后,查看git主目錄
$ ls /home/git
drwxr-xr-x   7 git  git  4096 Apr  3 23:50 bin               # 我們創(chuàng)建的存放gitolite二進(jìn)制
drwxrwxr-x   6 git  git  4096 Apr  3 23:40 gitolite
drwx------   6 git  git  4096 Apr  3 23:52 .gitolite
-rw-------   1 git  git  7130 Apr  3 23:52 .gitolite.rc
-rw-------   1 git  git   398 Apr  3 23:39 malun.pub         # 管理員的公鑰
drwxrw----   3 git  git  4096 Apr  3 23:40 .pki
-rw-------   1 git  git    19 Apr  4 00:26 projects.list     # 倉(cāng)庫(kù)列表(gitolite自動(dòng)創(chuàng)建)
drwx------   5 git  git  4096 Apr  4 00:26 repositories      # 存放所有倉(cāng)庫(kù)文件夾
drwx------   2 git  git  4096 Apr  4 15:50 .ssh

# repositories目錄下已經(jīng)有了兩個(gè)git倉(cāng)庫(kù)了。
# .
# |-- gitolite-admin.git    # 管理配置權(quán)限的倉(cāng)庫(kù)
# `-- testing.git           # 測(cè)試倉(cāng)庫(kù)

好了,到此位置,管理員就可以直接把默認(rèn)的遠(yuǎn)程管理的倉(cāng)庫(kù)gitolite-admin直接clone到本地進(jìn)行管理git服務(wù)了。

第五步:管理員在本地管理和配置服務(wù)器端的倉(cāng)庫(kù)

下載服務(wù)器端的遠(yuǎn)程管理倉(cāng)庫(kù)

# 下載遠(yuǎn)程管理倉(cāng)庫(kù), 請(qǐng)把a(bǔ)icoder.com換成你自己服務(wù)器的域名或者ip
$ git clone git@aicoder.com:gitolite-admin
$ cd gitolite-admin
# 目錄結(jié)構(gòu)如下:
# .
# ├── conf                # 配置文件夾
# │   └── gitolite.conf   # 配置權(quán)限的文件
# └── keydir              # 客戶端的公鑰文件夾,所有伙伴的公鑰要放到此目錄下
#     └── malun.pub

7.2 gitolite的權(quán)限配置

  • 添加其他開發(fā)的小伙伴

    把小伙伴的公鑰發(fā)給管理員。管理員添加到gitolite-admin倉(cāng)庫(kù)的keydir目錄下,注意文件名字格式為username.pub,username就是配置權(quán)限時(shí)的用戶名。

  • 配置用戶對(duì)倉(cāng)庫(kù)的讀寫權(quán)限

    直接修改conf文件夾下的,gitolite.conf文件。簡(jiǎn)單解釋下幾個(gè)用法:

    • repo代表倉(cāng)庫(kù)的意思,如果新添加一個(gè)repo,代表服務(wù)端新建一個(gè)空倉(cāng)庫(kù),倉(cāng)庫(kù)push到服務(wù)端后會(huì)自動(dòng)創(chuàng)建。
    • RW 代表可讀可寫
    • @all 代表所有人。
    • masterdev代表分支

    參考:

    @admin = malun  
    @om = malun bcd  
      
    repo gitolite-admin  
        RW+     =   malun 
      
    repo testing  
        RW+     =   @all  
      
    repo om  
        RW+     =   @admin  
        RW+ master = @admin  
        RW+ dev  =   @om  
    
  • 應(yīng)用修改到服務(wù)器端

做好配置后,由管理員把修改push到服務(wù)器端,會(huì)自動(dòng)處理。

$ git add conf
$ git add keydir
$ git commit -m "added foo, gave access to alice, bob, carol"
$ git push

此時(shí)登錄服務(wù)端,查看/home/git/repositories/目錄下是否增加了對(duì)應(yīng)的倉(cāng)庫(kù)了呢?

總結(jié)

其實(shí)配置這些并不繁瑣,但是需要你有一定的linux的經(jīng)驗(yàn),當(dāng)然你也可以選擇使用GitLab或者Github

最后希望能幫到你。


參考:

  1. git服務(wù)器搭建及gitolite權(quán)限管理

2.Centos搭建Git服務(wù)器和Gitolite權(quán)限設(shè)置

3.Linux 使用 Gitolite 架設(shè) Git Server


aicoder.com 是老馬親自帶的線下全棧實(shí)習(xí)

老馬免費(fèi)視頻教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • Git的基本工作流程 在工作目錄中修改某些文件。 對(duì)修改后的文件進(jìn)行快照,然后保存到暫存區(qū)域。 提交更新,將保存在...
    夜_雪閱讀 1,377評(píng)論 2 5
  • if(表達(dá)式)指定在表達(dá)式,計(jì)算結(jié)果為 TRUE 時(shí)執(zhí)行的命令.
    妹妹好想你閱讀 323評(píng)論 0 0
  • 其實(shí)他放不下手機(jī),是因?yàn)樗挪幌聦?duì)她的牽掛。 他每天醒來(lái)的第一件事就是拿起手機(jī)給她發(fā)早安,順便看看昨晚的晚安是否依...
    經(jīng)久別年閱讀 136評(píng)論 0 0

友情鏈接更多精彩內(nèi)容