最簡單的解決方案是設置一些像gitlab,它提供了一個Web界面,各種訪問控制,以及各種各樣的其他花裏胡哨的東西。
如果你真的想推出自己的:與directions in the Git book
入門設置服務器允許訪問一個共享的用戶通過SSH。
那些指令將讓你共享git
帳戶,每個人都可以訪問,並且將讓任何人推/拉從任何存儲庫。我們可以實現一個簡單的授權層,將用戶限制在特定目錄中的存儲庫。
開始用小包裝腳本:
#!/bin/sh
repo_prefix=$1
eval set -- $SSH_ORIGINAL_COMMAND
case "$1" in
(git-receive-pack|git-upload-pack|git-upload-archive)
# prevent attempts at using dir/../path to escape
# repository directory
case "$2" in
(*..*) echo "Invalid repository name." >&2
exit 1
;;
esac
repo_path="$repo_prefix/$2"
eval exec $1 $repo_path
;;
(*) echo "Unsupported command" >&2
exit 1
;;
esac
這會在前面加上一個前綴路徑,作爲命令行參數提供給所有的版本庫路徑。現在,我們需要安排這個包裝來攔截git操作。
要使用此功能,您需要修改您添加到git
用戶的authorized_keys
文件的公鑰。如果你遵循了Git的書的指示,authorized_keys
文件將在它的一個或多個公共密鑰,像這樣:
ssh-rsa AAAA...== some comment
對於每一個公共密鑰,你將需要添加一個配置選項,將導致包裝腳本將被調用以代替原始命令。從sshd
手冊頁:
文件的每一行包含一個鍵(空行和以「#」開始 被忽略爲註釋)。協議1個公共密鑰由以下空間分隔的字段 :選項,比特,指數, 模量,評論。協議2公鑰包括:options,keytype, base64編碼密鑰,註釋。選項字段是可選的...
略進一步下跌:
下列選項規範的支持(注意,選擇 關鍵字是不區分大小寫):[...]
命令= 「命令」
指定只要將此密鑰用於 身份驗證,就會執行該命令。由用戶提供的命令(如果有)被忽略... 最初由客戶端提供的命令在SSH_ORIGINAL_COMMAND環境變量中可用 。
考慮到這一點,我們修改我們authorized_keys
文件看起來是這樣的:
command="/usr/bin/git-wrapper.sh username" ssh-rsa AAAA...===
這意味着,當有人用相應的私有密鑰連接,sshd
將運行git-wrapper.sh username
,造成我們git-wrapper.sh
腳本使用字符串username
預存存儲庫路徑,確保git
只能在給定目錄中看到存儲庫。更具體地說,當您運行:
git push origin master
並假設origin
點project.git
git的服務器上,然後git
將試圖在遠程服務器上運行命令:
git-receive-pack project.git
我們的包裝腳本攔截,並將其轉變成:
git-receive-pack $1/project.git
因此,舉例來說,如果我們的混帳git
用戶家裏d irectory沒有倉庫:
git$ ls
而且我們authorized_keys
文件看起來是這樣的:
git$ cat .ssh/authorized_keys
command="/usr/bin/git-wrapper.sh alice" ssh-rsa ... [email protected]
command="/usr/bin/git-wrapper.sh bob" ssh-rsa ... [email protected]
這時如果alice
做到這一點:
alice$ git remote add origin [email protected]:project.git
git push origin master
她將看到:
fatal: 'alice/project.git' does not appear to be a git repository
fatal: Could not read from remote repository.
如果我們創建目標庫:
git$ mkdir alice
git$ git init --bare alice/project.git
然後,她可以推:
alice$ git push origin master
[...]
To [email protected]:project.git
* [new branch] master -> master
但如果Bob是盡力去克隆庫:
bob$ git clone [email protected]:project.git
它會失敗:
fatal: 'bob/project.git' does not appear to be a git repository
fatal: Could not read from remote repository.
Ev恩,如果他想的東西偷偷摸摸:
bob$ git clone [email protected]:../alice/project.git
Invalid repository name
fatal: Could not read from remote repository.
而且,在一個有點冗長簡單地說,就是你可以爲你的git倉庫服務器訪問授權。請注意,這僅僅是爲了演示而完成;您會希望在生產環境中使用更強大的腳本。
您當前的場景使用Unix內置設施隔離不想使用的用戶。這意味着您需要找到類似的功能來隔離用戶,並將該代碼添加到您現在擁有的代碼中。這可能比你想象的更復雜。你不希望unix用戶登錄的原因是什麼? –
這個設置的主要原因是我想了解如何做到這一點,以瞭解更多關於Git和UNIX的知識。例如。 Github和Bitbucket使用這種方法,所以我只是想了解它是如何工作的,如果它看起來不錯,我想我可以使用它。 – lklun