章節 ▾ 第二版

4.4 Git 伺服器 - 設定伺服器

設定伺服器

我們來一步步講解如何在伺服器端設定 SSH 訪問。在這個例子中,你將使用 authorized_keys 方法來認證你的使用者。我們還假設你正在執行一個標準的 Linux 發行版,比如 Ubuntu。

注意

這裡描述的許多操作都可以透過使用 ssh-copy-id 命令自動化完成,而無需手動複製和安裝公鑰。

首先,你需要建立一個 git 使用者賬戶,併為該使用者建立一個 .ssh 目錄。

$ sudo adduser git
$ su git
$ cd
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys

接下來,你需要將一些開發人員的 SSH 公鑰新增到 git 使用者的 authorized_keys 檔案中。假設你有一些受信任的公鑰並已將它們儲存到臨時檔案中。同樣,公鑰看起來像這樣

$ cat /tmp/id_rsa.john.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair

你只需將它們追加到 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

現在,你可以透過執行帶有 --bare 選項的 git init 命令為他們設定一個空倉庫,該選項會初始化一個沒有工作目錄的倉庫

$ cd /srv/git
$ mkdir project.git
$ cd project.git
$ git init --bare
Initialized empty Git repository in /srv/git/project.git/

然後,John、Josie 或 Jessica 可以透過將其新增為遠端倉庫並推送一個分支來將他們專案的第一版本推送到該倉庫。請注意,每次你想新增一個專案時,都必須有人登入到伺服器並建立一個裸倉庫。讓我們使用 gitserver 作為你設定了 git 使用者和倉庫的伺服器的主機名。如果你在內部執行它,並且你設定了 DNS 使 gitserver 指向該伺服器,那麼你可以直接使用這些命令(假設 myproject 是一個包含檔案的現有專案)

# on John's computer
$ cd myproject
$ git init
$ git add .
$ git commit -m 'Initial commit'
$ git remote add origin git@gitserver:/srv/git/project.git
$ git push origin master

此時,其他人可以輕鬆地克隆它,並將更改推送回去

$ git clone git@gitserver:/srv/git/project.git
$ cd project
$ vim README
$ git commit -am 'Fix for README file'
$ git push origin master

透過這種方法,你可以為少數開發人員快速搭建一個讀/寫 Git 伺服器。

你應該注意,目前所有這些使用者也可以登入到伺服器並以 git 使用者的身份獲取 shell。如果你想限制這一點,你必須在 /etc/passwd 檔案中將 shell 更改為其他內容。

你可以使用 Git 附帶的一個名為 git-shell 的受限 shell 工具,輕鬆地將 git 使用者賬戶限制為僅執行 Git 相關活動。如果你將此設定為 git 使用者賬戶的登入 shell,則該賬戶將無法正常訪問你的伺服器 shell。要使用此功能,請為該賬戶的登入 shell 指定 git-shell 而不是 bashcsh。為此,如果 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 -e /etc/shells  # and add the path to git-shell from last command

現在你可以使用 chsh <username> -s <shell> 來編輯使用者的 shell

$ sudo chsh git -s $(which git-shell)

現在,git 使用者仍然可以使用 SSH 連線來推送和拉取 Git 倉庫,但無法登入到機器 shell。如果你嘗試,會看到類似這樣的登入拒絕

$ 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.

此時,使用者仍然能夠使用 SSH 埠轉發訪問 Git 伺服器能夠到達的任何主機。如果你想阻止這種情況,可以編輯 authorized_keys 檔案,並在你希望限制的每個金鑰前新增以下選項

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty

結果應該像這樣

$ cat ~/.ssh/authorized_keys
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4LojG6rs6h
PB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4kYjh6541N
YsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9EzSdfd8AcC
IicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myivO7TCUSBd
LQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPqdAv8JggJ
ICUvax2T9va5 gsg-keypair

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDEwENNMomTboYI+LJieaAY16qiXiH3wuvENhBG...

現在 Git 網路命令仍然可以正常工作,但使用者將無法獲得 shell。正如輸出所示,你還可以在 git 使用者的主目錄中設定一個目錄,以稍微自定義 git-shell 命令。例如,你可以限制伺服器將接受的 Git 命令,或者自定義使用者嘗試透過 SSH 登入時看到的提示資訊。執行 git help shell 獲取更多關於自定義 shell 的資訊。

scroll-to-top