-
1. 起步
-
2. Git 基礎
-
3. Git 分支
-
4. 伺服器上的 Git
- 4.1 協議
- 4.2 在伺服器上部署 Git
- 4.3 生成 SSH 公鑰
- 4.4 設定伺服器
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方託管服務
- 4.10 小結
-
5. 分散式 Git
-
A1. 附錄 A: Git 在其他環境
- A1.1 圖形介面
- A1.2 Visual Studio 中的 Git
- A1.3 Visual Studio Code 中的 Git
- A1.4 IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine 中的 Git
- A1.5 Sublime Text 中的 Git
- A1.6 Bash 中的 Git
- A1.7 Zsh 中的 Git
- A1.8 PowerShell 中的 Git
- A1.9 小結
-
A2. 附錄 B: 在應用程式中嵌入 Git
-
A3. 附錄 C: Git 命令
4.4 Git on the Server - Setting Up the Server
設定伺服器
我們來介紹一下如何在伺服器端設定 SSH 訪問。在此示例中,您將使用 authorized_keys 方法來驗證您的使用者。我們還假設您正在執行像 Ubuntu 這樣的標準 Linux 發行版。
|
注意
|
這裡描述的大部分內容都可以透過使用 |
首先,您需要建立一個 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
現在,您可以執行 git init --bare 命令為他們設定一個空的儲存庫,該命令在沒有工作目錄的情況下初始化儲存庫。
$ cd /srv/git
$ mkdir project.git
$ cd project.git
$ git init --bare
Initialized empty Git repository in /srv/git/project.git/
然後,John、Josie 或 Jessica 可以透過將其新增為遠端並推送一個分支來將他們專案的第一個版本推送到該儲存庫。請注意,每次您想新增一個專案時,都必須有人登入到機器並建立一個裸倉庫。我們假設您設定了 git 使用者和儲存庫的伺服器主機名為 gitserver。如果您是內部執行,並且為 gitserver 設定了 DNS 指向該伺服器,那麼您可以基本按照命令進行操作(假設 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。要使用此功能,如果 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 登入時看到的訊息。有關自定義 shell 的更多資訊,請執行 git help shell。