[原创]为cvs建立只读用户

[原创]为cvs建立只读用户

作者:张元一 日期:2004.4.17

    注:本文部分参考何伟平先生的文章.

   

第一部分 建立CVS服务器

    首先,以root进入系统,然后为CVS建立一个组,命令如下:

     groupadd cvsgroup

    为CVS建立一个用户并加入cvsgroup组:

     adduser cvsroot -g cvsgroup

    为CVS用户设置密码:

     passwd cvsroot

    当然这不是必须的,你也可以在你现在的帐户地下建立CVS服务器,但是为了以后方便管理,我还是建议你为CVS单独创建一个帐户.

    然后以cvsroot帐户登录,执行下列命令:

     export CVSROOT="/home/cvsroot"

     cvs init

    注意:不要在root帐户下执行上面的命令,否则将只有管理员才能够访问CVS下面的文件.

     cd /home

     chmod 771 cvsroot

    上面的第二条命令是为了让所有处于cvsgroup组内的用户都可以访问cvsroot文件夹,接着为CVS建立一个示范项目:

     cd /home/cvsroot

     mkdir sampleproj

    接着,又要回到root帐户,你需要为CVS在xinetd中添加一个服务,让CVS服务器在每次开机时自动运行.

    首先在/etc/xinetd.d/文件夹下添加一个文件cvspserver,内容如下:

     # default: on

     # description: The cvs server sessions;

     

     service cvsserver

     {

     socket_type = stream

     wait = no

     user = root

     server = /usr/bin/cvs

     server_args = -f --allow-root=/home/cvsroot pserver

     log_on_failure += USERID

     }

    stream表示实用TCP作为网络连接的方式,/usr/bin/cvs是CVS程序的位置,/home/cvsroot就是你的CVS服务器的跟目录,pserver表示使用口令认证方式.

    然后修改该文件权限:

     chmod 644 cvspserver

    接着在/etc/services文件中加入:

     cvsserver 2401/tcp

    当然服务名也可以起其他的名字,只要不和系统中现有的服务冲突就行.

    然后重新起动xinetd服务器,到此为止,你的CVS服务器已经配置好了.

   

第二部分 建立只读帐户

    现在,你的CVS服务器已经建立好了,在说明如何建立只读帐户之前,还是让我们先来了解一下CVS是如何管理帐户的吧!

    CVS的帐户信息都存在$CVSROOT/CVSROOT/passwd文件中,$CVSROOT代表CVS服务器的根目录,passwd文件的组织形式如下:

     {cvs 用户名}:[加密的口令]:[等效系统用户名]

    下面是一个例子:

     anonymous:

     bach:ULtgRLXo7NRxs

     spwang:1sOp854gDF3DY

     melissa:tGX1fS8sun6rY:pubcvs

     qproj:XR4EZcEs0szik:pubcvs

    其中第一项代表一个匿名帐户,它没有密码,第二项和第三项都是普通的帐户,第4项和第5项则同系统用户pubcvs相关联.

    同系统用户相关连的意思是说,这个CVS用户在此系统上没有帐户,所以需要同一个系统帐户进行关联,反过来也就是说没有同系统用户先关联的CVS用户本身就是一个系统用户,如果不是的话,那么他将无法登录.这也就是说,要是上面几个用户正常工作,你的系统上至少要有下列帐户存在:

     anonymous

     bach

     spwang

     pubcvs

    并且这些帐户都必须属于cvsgroup组。

    另外注意的是:passwd文件中的密码是经过crypt函数加密的,下面是一个加密的小程序crypt.c:

     #define _XOPEN_SOURCE

     #include <unistd.h>

     #include <stdio.h>

     int main( int args, char** argv )

     {

     char pass[255];

     char salt[] = "ab";

     

     printf( "lease input the passwrod you want to encrypt:" );

     scanf( "%s", pass );

     

     char *en = crypt( pass, salt );

     printf( "The encrypted password is:%s\\n", en );

     

     return 0;

     }

    编译执行语句为:

     gcc -o encrypt -lcrypt crypt.c

     ./encrypt

    注意:passwd文件的最后必须有一个新行.

    只将用户添加到passwd文件还不行,你需要为他分配一定的权限.CVS对用户权限的控制是通过$CVSROOT/CVSROOT/下的readers和往日特染色文件进行的.

    CVS的判断逻辑是:

    如果一个用户在readers文件中,那么他是只读的,否则,如果他在writers中,那么他具有写权限,否则,他还是只读的.也就是说,不在writers文件中的用户都只具有读权限.

    下面是两个文件的实例:

     readers:

     anonymous

     bach

     

     writers:

     spwang

     qproj

    其中anonymous、bach和melissa具有只读权限,而spwang和qproj则具有写权限。

    现在你可以切换到其它用户并执行下列命令登录:

     export CVSROOT=":pserver:qproj@localhost:/home/cvsroot"

     cvs login

    如果登录成功,你的家目录中会存在一个.cvspass文件用来保存你的登录信息,然后你就可以执行下列命令来获得系统文件并提交你的更新了:

     cvs checkout sampleproj

    现在似乎大功告成,但是当你用anonymous用户登录,并想要获得工程文件时,你会得到一个错误告诉你没有足够的权限创建lock文件。这是由于你的帐户是只读的,它不能在CVS服务器上创建任何文件,即使是为了下载项目文件需要也不行。

    因此现在要使你的帐户真正的成为只读帐户,你就需要让他们能够创建这些临时文件而又不能对项目文件进行更改,具体的步骤如下:

    首先:创建/var/lock/cvs文件夹并让它属于cvsgroup组,然后更改$CVSROOT/CVSROOT/config文件,去掉这一行之前的#号:

     LockDir=/var/lock/cvs

    然后执行:

     chmod 771 /var/lock/cvs

    让同组用户都可以访问它,现在anonymous就是真正的只读用户了。

    最后,要注意的是,最好让所有的只读用户对应的系统用户都属于cvsgroup组,并且只属于cvsgroup组,如果不这样的话,很可能会发生这样的情况,一个用户下载了sampleproj项目,并在/var/lock/cvs中创建了一个sampleproj文件夹,如果另一个用户也需要下载sampleproj项目,而他们又不属于一个组,那么第二个用户将由于没有足够的权限访问sampleproj而无法读取sampleproj项目。

    我的做法是创建两个用户,cvsroot和cvspub,其中所有具有写权限的用户都映射到cvsroot,而只读用户则都映射到cvspub帐户。当然你也可以建立别的帐户并将它加入到cvsgroup组,但是注意不要为这个用户建立单独的组。      
正在学用户章节,多谢大虾      
呵呵,老帖,写的比较详细, 加为精华先