12

我很好奇 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 完成我想要的吗?

4

3 回答 3

28

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

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

ssh调用gitolite的方式在《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...

首先,它找出该文件中的哪些公钥与传入的登录名匹配。一旦找到匹配项,它将运行该行给出的命令;例如,如果我登录,它将运行[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()功能中所述info

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 文档现在包括总结所有部分的图表:

ssh 和 Gitolite

于 2012-11-10T07:41:51.307 回答
5

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

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

于 2012-12-23T14:56:53.290 回答
0

基本步骤是:

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

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

于 2012-11-10T02:58:23.800 回答