gitolite本身是一个授权层,不需要使用ssh。
它只需要知道谁在调用它,以便授权或拒绝该人执行git命令。
SSH用于身份验证(但您也可以使用Http Apache进行身份验证,例如)
Gitolite由ssh调用的方式在“Gitolite和ssh”中有详细解释,并使用ssh机制强制命令:
"
~/.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会查看其配置文件,然后允许或拒绝该请求。
由于Gitolite是用Perl编写的,所以
authorized_keys
调用了一个Perl脚本(
gitolite-shell
)。它同样可以调用JavaScript程序。
如果你在GitHub上的ssh没有任何命令,你会收到一个问候消息,就像你在问题中提到的那样。
Gitolite 也会显示类似的消息,详见
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
2013年底的Gitolite文档现在包括了那个总结所有部分的图表: