gitolite本身是一個authorization層,它不需要ssh。
它只需要知道誰是正在調用它,以授權或不是那個人做git命令。
SSH用於身份驗證(但你可以使用HTTP阿帕奇認證爲好,例如)
的方式gitolite通過SSH稱爲「Gitolite and ssh」進行了解釋,並使用SSH機制forced command:
![http://oreilly.com/catalog/sshtdg/chapter/ssh_0802.gif](https://i.stack.imgur.com/2WQvb.gif)
的~/.ssh/authorized_keys
(在gitolite SSH服務器)上的樣子:
command="[path]/gitolite-shell sitaram",[more options] ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA18S2t...
command="[path]/gitolite-shell usertwo",[more options] ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEArXtCT...
首先,它找出該文件中的哪些公鑰與傳入登錄匹配。一旦匹配被發現,它將運行在該行給出的命令;例如,如果我登錄,它將運行[path]/gitolite-shell sitaram
。
所以首先要注意的是,這樣的用戶不會得到「shell訪問」,這是很好的!
(強制命令=無交互shell會話:它只會提供一個受限shell,只執行一個腳本,總是相同的),但是
運行命令之前,sshd
設置一個名爲SSH_ORIGINAL_COMMAND
的環境變量,其中包含您的工作站發出的實際的git
命令。
這是如果在授權密鑰文件中沒有command=
部分就會運行的命令。
當gitolite-shell
得到控制,它會在第一個參數(「sitaram
」,‘usertwo
’等)來確定你是誰。然後,它會查看SSH_ORIGINAL_COMMAND
變量以找出要訪問的存儲庫,以及您是正在讀取還是正在寫入。
現在,它有用戶,存儲庫和訪問請求(讀/寫),gitolite查看其配置文件,並允許或拒絕請求。
該authorized_keys
調用一個perl腳本(gitolite-shell
)事實上是因爲Gitolite是用Perl編寫。
它可以很好地調用一個JavaScript程序。
如果您在GitHub上的ssh沒有任何命令,你會得到一個問候信息,就像在你的問題你提。
Gitolite顯示類似的消息,如詳述於print_version()
function of the info
command script:
sub print_version {
chomp(my $hn = `hostname -s 2>/dev/null || hostname`);
my $gv = substr(`git --version`, 12);
$ENV{GL_USER} or _die "GL_USER not set";
print "hello $ENV{GL_USER}, this is " . ($ENV{USER} || "httpd") . "\@$hn running gitolite3 " . version() . " on git $gv\n";
}
消息看起來像:
hello admin, this is [email protected] running gitolite3 v3.0-12-ge0ed141 on git 1.7.3.4
的late 2013 Gitolite documentation現在包含圖,它總結了所有件:
![ssh and Gitolite](https://i.stack.imgur.com/F7hM7.png)
gitolite是開源的,你可以通過閱讀代碼/文檔來了解它是如何工作的。 – tpg2114
我已閱讀代碼,並從我可以收集它是一個Perl腳本。我不知道Perl,所以我希望有人能夠提供一個快速的例子來產生我上面的東西。 – user1813844
http://stackoverflow.com/questions/5180981/ssh-client-for-node-js – Peter