2012-11-10 11 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は、sshを必要としない層である。authorization
を知る必要があるのは、がそれを呼び出しているだけなので、その人にgitコマンドを実行させるかどうかは分かりません。

SSHは、認証のために使用されている(しかし、あなたは、例えば、同様の認証にHTTPにApacheを使用することができます)道のgitoliteが「Gitolite and ssh」で説明されている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を実行します。
最初に注意しなければならないのは、このようなユーザーは「シェルアクセス」を得られないということです。

強制コマンド=なしの対話型シェルセッション:それだけで一つだけのスクリプト、常に同じ実行、制限付きシェルを提供します)、しかし、コマンドを実行する前に

sshdをワークステーションが送信した実際のgitコマンドを含むSSH_ORIGINAL_COMMANDという環境変数を設定します。
command=の部分が認証済みキーファイルにない場合に実行されるコマンドです。

gitolite-shellが制御を取得すると、それはあなたが誰であるかを判断するために、最初の引数(「sitaram」、 『usertwo』など)を調べます。次に、SSH_ORIGINAL_COMMAND変数を調べて、アクセスしたいリポジトリと、読んでいるか書いているかを調べます。

ユーザ、リポジトリ、およびアクセス要求(読み取り/書き込み)がであるため、gitoliteは設定ファイルを調べ、要求を許可または拒否します。 GitoliteはPerlで書かれているので、

authorized_keysはperlスクリプト(gitolite-shell)を呼び出すという事実です。
これは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. は、これらのアクセス制御リストつまり

に公開鍵を、マップ

  • にログインしようとしている人の公開鍵をチェック作業するためには、ユーザーから公開鍵を取得してから、ユーザーと権限のペアになるリスト(ファイル、データベースなど)を生成する必要があります。

  • +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で管理できるユーザーは非常に多いです!