像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?

gitolite本身就是一个不需要ssh的授权层。
只需要知道在调用它,以便授权或不允许该人员执行git命令。

SSH用于身份validation(但也可以使用Http Apache进行身份validation)

gitolite被ssh调用的方式在“ gitolite和ssh ”中解释,并使用ssh机制强制命令

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... 

首先,它找出该文件中的哪个公钥与传入login匹配。 一旦find匹配, 它将运行该命令给出的命令 ; 例如,如果我login,它会运行[path]/gitolite-shell sitaram
所以首先要注意的是,这样的用户不会得到“shell访问”,这是好的!

强制命令=没有交互式shell会话 :它只会提供一个受限制的shell ,只执行一个脚本,总是一样的)

然而,在运行该命令之前, sshd设置了一个名为SSH_ORIGINAL_COMMAND的环境variables,其中包含工作站发出的实际git命令。
如果在授权密钥文件中没有command=部分,则这是可能运行的command=

gitolite-shell得到控制时,它会查看第一个参数(“ sitaram ”,“ usertwo ”等)来确定你是谁。 然后,它查看SSH_ORIGINAL_COMMANDvariables,找出您要访问的存储库,以及您是正在读取还是正在写入。

现在,它有一个用户,存储库和访问请求(读/写) ,gitolite查看其configuration文件,并允许或拒绝请求。

authorized_keys调用Perl脚本( gitolite-shell )的事实是因为Gitolite是用perl编写的。
它可以很好地调用一个JavaScript程序。


如果你的GitHub没有任何命令的ssh,你会得到一个问候信息,就像你在问题中提到的一样。
Gitolite显示了类似的信息,详情请print_version() info命令脚本的print_version()函数 :

 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 

现在的Gitolite文档现在包含了所有这些部分的总结:

ssh和Gitolite

请注意,sshd执行〜/ .ssh / authorized_keys文件的线性扫描。 一旦你在那里得到大约3000个密钥,那些在密钥文件后面出现密钥的人开始注意到时滞 – 它开始比networking滞后更多:-)

这就是为什么github有自己的补丁版本的sshd。 他们有太多的用户可以用普通的sshd来pipe理!

基本步骤是:

  1. 检查尝试login的人的公共密钥
  2. 将公钥映射到访问控制列表

换句话说,要使这些工作起作用,必须从用户那里获取公钥,然后生成一个列表(文件,数据库等),将一个密钥与用户和权限配对。