W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
我們來看看如何配置服務(wù)器端的 SSH 訪問。本例中,我們將使用 authorized_keys
方法來對用戶進(jìn)行認(rèn)證。同時(shí)我們假設(shè)你使用的操作系統(tǒng)是標(biāo)準(zhǔn)的 Linux 發(fā)行版,比如 Ubuntu。首先,創(chuàng)建一個(gè)操作系統(tǒng)用戶 git
,并為其建立一個(gè) .ssh
目錄。
$ sudo adduser git
$ su git
$ cd
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
接著,我們需要為系統(tǒng)用戶 git
的 authorized_keys
文件添加一些開發(fā)者 SSH 公鑰。假設(shè)我們已經(jīng)獲得了若干受信任的公鑰,并將它們保存在臨時(shí)文件中。與前文類似,這些公鑰看起來是這樣的:
$ cat /tmp/id_rsa.john.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair
將這些公鑰加入系統(tǒng)用戶 git
的 .ssh
目錄下 authorized_keys
文件的末尾:
$ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.josie.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.jessica.pub >> ~/.ssh/authorized_keys
現(xiàn)在我們來為開發(fā)者新建一個(gè)空倉庫??梢越柚鷰?--bare
選項(xiàng)的 git init
命令來做到這一點(diǎn),該命令在初始化倉庫時(shí)不會創(chuàng)建工作目錄:
$ cd /opt/git
$ mkdir project.git
$ cd project.git
$ git init --bare
Initialized empty Git repository in /opt/git/project.git/
接著,John、Josie 或者 Jessica 中的任意一人可以將他們項(xiàng)目的最初版本推送到這個(gè)倉庫中,他只需將此倉庫設(shè)置為項(xiàng)目的遠(yuǎn)程倉庫并向其推送分支。請注意,每添加一個(gè)新項(xiàng)目,都需要有人登錄服務(wù)器取得 shell,并創(chuàng)建一個(gè)裸倉庫。我們假定這個(gè)設(shè)置了 git
用戶和 Git 倉庫的服務(wù)器使用 gitserver
作為主機(jī)名。同時(shí),假設(shè)該服務(wù)器運(yùn)行在內(nèi)網(wǎng),并且你已在 DNS 配置中將 gitserver
指向此服務(wù)器。那么我們可以運(yùn)行如下命令(假定 myproject
是已有項(xiàng)目且其中已包含文件):
# on John's computer
$ cd myproject
$ git init
$ git add .
$ git commit -m 'initial commit'
$ git remote add origin git@gitserver:/opt/git/project.git
$ git push origin master
此時(shí),其他開發(fā)者可以克隆此倉庫,并推回各自的改動(dòng),步驟很簡單:
$ git clone git@gitserver:/opt/git/project.git
$ cd project
$ vim README
$ git commit -am 'fix for the README file'
$ git push origin master
通過這種方法,你可以快速搭建一個(gè)具有讀寫權(quán)限、面向多個(gè)開發(fā)者的 Git 服務(wù)器。
需要注意的是,目前所有(獲得授權(quán)的)開發(fā)者用戶都能以系統(tǒng)用戶 git
的身份登錄服務(wù)器從而獲得一個(gè)普通 shell。如果你想對此加以限制,則需要修改 passwd
文件中(git
用戶所對應(yīng))的 shell 值。
借助一個(gè)名為 git-shell
的受限 shell 工具,你可以方便地將用戶 git
的活動(dòng)限制在與 Git 相關(guān)的范圍內(nèi)。該工具隨 Git 軟件包一同提供。如果將 git-shell
設(shè)置為用戶 git
的登錄 shell(login shell),那么用戶 git
便不能獲得此服務(wù)器的普通 shell 訪問權(quán)限。若要使用 git-shell
,需要用它替換掉 bash 或 csh,使其成為系統(tǒng)用戶的登錄 shell。為進(jìn)行上述操作,首先你必須確保 git-shell
已存在于 /etc/shells
文件中:
$ cat /etc/shells # see if `git-shell` is already in there. If not...
$ which git-shell # make sure git-shell is installed on your system.
$ sudo vim /etc/shells # and add the path to git-shell from last command
現(xiàn)在你可以使用 chsh <username>
命令修改任一系統(tǒng)用戶的 shell:
$ sudo chsh git # and enter the path to git-shell, usually: /usr/bin/git-shell
這樣,用戶 git
就只能利用 SSH 連接對 Git 倉庫進(jìn)行推送和拉取操作,而不能登錄機(jī)器并取得普通 shell。如果試圖登錄,你會發(fā)現(xiàn)嘗試被拒絕,像這樣:
$ ssh git@gitserver
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to gitserver closed.
現(xiàn)在,網(wǎng)絡(luò)相關(guān)的 Git 命令依然能夠正常工作,但是開發(fā)者用戶已經(jīng)無法得到一個(gè)普通 shell 了。正如輸出信息所提示的,你也可以在 git
用戶的家目錄下建立一個(gè)目錄,來對 git-shell
命令進(jìn)行一定程度的自定義。比如,你可以限制掉某些本應(yīng)被服務(wù)器接受的 Git 命令,或者對剛才的 SSH 拒絕登錄信息進(jìn)行自定義,這樣,當(dāng)有開發(fā)者用戶以類似方式嘗試登錄時(shí),便會看到你的信息。要了解更多有關(guān)自定義 shell 的信息,請運(yùn)行 git help shell
。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: