像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机制强制命令 :
~/.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_COMMAND
variables,找出您要访问的存储库,以及您是正在读取还是正在写入。现在,它有一个用户,存储库和访问请求(读/写) ,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文档现在包含了所有这些部分的总结:
请注意,sshd执行〜/ .ssh / authorized_keys文件的线性扫描。 一旦你在那里得到大约3000个密钥,那些在密钥文件后面出现密钥的人开始注意到时滞 – 它开始比networking滞后更多:-)
这就是为什么github有自己的补丁版本的sshd。 他们有太多的用户可以用普通的sshd来pipe理!
基本步骤是:
- 检查尝试login的人的公共密钥
- 将公钥映射到访问控制列表
换句话说,要使这些工作起作用,必须从用户那里获取公钥,然后生成一个列表(文件,数据库等),将一个密钥与用户和权限配对。