2012-11-10 52 views
9

我很好奇程序如gitolite的工作原理 - 特別是他們如何與SSH協議交互以提供量身定製的體驗。有人可以提供一個例子說明我可以如何完成類似下面的內容,以及我可以在哪裏瞭解更多關於此主題的內容?gitolite等程序如何工作?

→ ssh [email protected] 
PTY allocation request failed on channel 0 
Hi <username>! You've successfully authenticated, but GitHub does not provide shell access. 
Connection to github.com closed. 

一個問題:我的主要語言是JavaScript。是否有可能通過NodeJS完成我想要的功能?

+2

gitolite是開源的,你可以通過閱讀代碼/文檔來了解它是如何工作的。 – tpg2114

+0

我已閱讀代碼,並從我可以收集它是一個Perl腳本。我不知道Perl,所以我希望有人能夠提供一個快速的例子來產生我上面的東西。 – user1813844

+0

http://stackoverflow.com/questions/5180981/ssh-client-for-node-js – Peter

回答

24

gitolite本身是一個authorization層,它不需要ssh。
它只需要知道誰是正在調用它,以授權或不是那個人做git命令。

SSH用於身份驗證(但你可以使用HTTP阿帕奇認證爲好,例如)

的方式gitolite通過SSH稱爲「Gitolite and ssh」進行了解釋,並使用SSH機制forced command

http://oreilly.com/catalog/sshtdg/chapter/ssh_0802.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

+0

因此,出於好奇,GitHub等網站如何利用這些技術?爲包含每個人的公共密鑰的'git'用戶維護'authorized_keys'文件以及處理對該文件的更改似乎不切實際(刪除密鑰和內容)? – user1813844

+0

@ user1813844 GitHub?但GitHub肯定*不*使用gitolite。它有自己的ssh密鑰管理。我認爲這與gitolite所使用的ssh密鑰管理沒有多少區別。 – VonC

+0

那麼他們有自己的SSHD版本嗎?我試圖弄清楚他們如何用標準的現有技術構建他們的系統。 – user1813844

0

的基本步驟是:

  1. 檢查嘗試登錄
  2. 地圖,將公共密鑰訪問控制列表

換句話說,對於這些人的公鑰要做的事情,你必須從用戶那裏獲取公鑰,然後生成一個列表(文件,數據庫等),將密鑰與用戶和權限配對。

+0

我對使用SSH協議的機制更感興趣。 – user1813844

+0

http://stackoverflow.com/questions/402615/how-to-restrict-ssh-users-to-a-predefined-set-of-commands-after-login然後讓你的問題更清晰。我查看了gitolite源代碼頂部的註釋,它說:「從〜/ .ssh/authorized_keys調用腳本」,所以我搜索瞭如何從authorized_keys文件調用腳本並發現該問題。 – tpg2114

+0

我並不想在這裏大肆渲染。但是,我並不傾向於詳細回答這個問題,看起來似乎沒有多少努力去獨立解決問題。 – tpg2114

5

請注意,sshd執行〜/ .ssh/authorized_keys文件的線性掃描。一旦你在那裏獲得大約3000個密鑰,那些其密鑰出現在文件後面的人開始注意到滯後 - 它開始超過網絡滯後:-)

這就是爲什麼github有自己的補丁版本的sshd。他們有太多的用戶可以用正常的sshd來管理!