像gitolite这样的程序如何运作?

时间:2012-11-10 02:39:57

标签: ssh gitolite

我很好奇gitolite这样的程序是如何工作的 - 特别是它们如何与SSH协议交互以提供量身定制的体验。有人可以提供一个例子,说明我可以如何完成以下内容以及我可以在哪里了解更多有关此主题的内容吗?

→ ssh git@github.com
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完成我想要的东西?

3 个答案:

答案 0 :(得分:27)

gitolite本身是一个authorization层,不需要ssh 它只需要知道正在调用它,以便授权该人执行git命令。

SSH用于身份验证(例如,您也可以使用Http Apache进行身份验证)

ssh调用gitolite的方式在“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 git@server running gitolite3 v3.0-12-ge0ed141 on git 1.7.3.4

late 2013 Gitolite documentation现在包含了总结所有部分的图表:

ssh and Gitolite

答案 1 :(得分:5)

请注意,sshd会对〜/ .ssh / authorized_keys文件进行线性扫描。一旦你获得了大约3000个密钥,那些密钥出现在文件后面的人开始注意到滞后 - 它开始超过网络滞后: - )

这就是为什么github有自己的sshd补丁版本的一个原因。他们有太多的用户无法使用普通的sshd进行管理!

答案 2 :(得分:0)

基本步骤是:

  1. 检查尝试登录的人的公钥
  2. 将公钥映射到访问控制列表
  3. 换句话说,要使这些工作起作用,您必须从用户获取公钥,然后生成将密钥与用户和权限配对的列表(文件,数据库等)。