gitolite 本身就是一个 authorization 层,不需要 ssh。
它只需要知道 谁 在调用它,以便授权或不授权该人执行 git 命令。
SSH 用于身份验证(但您也可以使用 Http Apache 进行身份验证,例如)
ssh调用gitolite的方式在“Gitolite and ssh”中有说明,使用ssh机制forced command:
~/.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 现在包含总结所有部分的图表: