Chinaunix首页 | 论坛 | 博客
  • 博客访问: 302850
  • 博文数量: 32
  • 博客积分: 2179
  • 博客等级: 大尉
  • 技术积分: 443
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-21 10:30
文章分类

全部博文(32)

文章存档

2014年(1)

2013年(4)

2011年(4)

2009年(11)

2008年(5)

2007年(7)

我的朋友

分类: WINDOWS

2007-04-11 11:39:55

 CVS 是目前最常用的版本控制和软件配置系统。其开源性在其普及的过程中功不可没,然而正因为开源造成了其易用性较差。往往一个功能需要通过几个看似不相干的操作配合才能进行。Windows下CVS的多帐户配置正是这样一个相当重要的,但很不好操作的功能。几个难点如下:
  1. CVS源自Unix系统,其Windows的移植版并没有服务器功能。在Windows下一般采用安装CVSNT这个软件来建立CVS Repository,但CVSNT的操作方法和原始的CVS略微不同。
  2. CVS本身是命令行形式,其配置过程比较繁杂。
  3. CVS的多帐户配置需要手动修改Repository的CVSROOT文件夹里的文件,缺乏统一的界面。

在安装了CVSNT服务器之后,默认的用户就是建立Repository的Windows系统的登陆帐户,但在多人开发的时候,肯定没人希望大家都使用同一个名字来Commit;更重要的是,我们可能需要配置开发人员的权限,例如限制某些人只能看程序,而某些人可以Commit程序,某些人可以添加新的Module。以下是详细的步骤,环境是CVSNT 2.5.03 (Build 2151) + TortoiseCVS 1.8.25:

1. 使用CVSNT建立一个Repository。假设初始使用Windows的管理员administrator密码登陆,Repository使用 Pserver协议,IP是1.2.3.4,端口号是2401,Repository名称是/TestRep,密码是123。这时的 administrator也是此Repository的管理员。

2. 为了进行多用户配置,必须修改Repository的CVSROOT目录的几个文件。首先在客户端将:pserver: administrator@1.2.3.4/TestRep设为CVSROOT环境变量(请注意区分CVSROOT目录和CVSROOT环境变量)。然后用administrator登陆到CVS,最后Check Out出此CVSROOT目录。命令如下所示:

cvs login
//输入密码123
cvs co CVSROOT

3. 在服务器端为Windows添加一个专门用于CVS操作的Windows帐户。所有的CVS帐户都要映射到这个Windows帐户上进行实际的操作。虽然很多资料并没有提到需要建立Windows帐户,但我在实验中发现没有这种帐户,CVS在后边执行任何操作时都会报告没有此帐户的错误。假如这个新的帐户叫做cvsuser。使用Windows命令

net user cvsuser cvsuserpassword /Add

可以添加此帐户。在添加完成之后,一定要记得将/TestRep在服务器上的实际文件夹的权限里添加cvsuser的读写权限,否则到最后任何映射到cvsuser的CVS帐户都会因为没有写权限无法进行正常的commit操作。首先在服务器上的资源管理器里的“工具”菜单里找到“文件夹选项”,在随后出现的“查看”选项卡里找到“使用简单文件夹共享”的项目,取消掉前面的勾,单击确定。然后右击/TestRep所在文件夹,单击“属性”。在随后打开的对话框里可以看到“安全”选项卡。我们需要在这里添加cvsuser的读写权限。

4.为CVS添加自己的帐户。通过使用命令cvs passwd我们可以添加任意多个CVS帐户(当然,只是针对当前的Repository)。所有的帐户信息会被保存在CVSROOT目录的passwd 文件当中。然而这个文件是不能Check Out出来的,只能在服务器那里看到它,并且其保存的密码信息是被加过密的。我们可以添加cvsadmin,user1,user2,anonymous 等用户。例如添加cvsadmin时的命令是:

cvs passwd -a cvsadmin -r cvsuser
//输入cvsadmin的密码
//再次输入cvsadmin的密码

这样就新添了cvsadmin帐户,并将其映射到Windows帐户cvsuser上。我期望将cvsadmin作为以后/TestRep的管理员。这一点十分重要,如果这时候不设置的话,再将CVS改为“仅使用CVS帐户校验模式”之后就再也没有机会添加管理员了(因为只有管理员可以看得到和操作CVSROOT目录)。

5.设定cvsadmin为CVS管理员。在客户端的CVSROOT目录下新添一个名为admin的文件。在里面将每一个想要升为管理员的CVS帐户的帐户名写到文件中,每行一个帐户名。当然admin文件只有放到服务器,cvsadmin的升迁才能生效。但是,仅仅是这么将admin文件提交上去是不能起作用的。在提交它之前,必须将admin的信息添加到checkoutlist文件中。checkoutlist的格式在文件中有介绍,是“空格文件名 空格 出错信息 回车符”。我们在里面添加一条记录:

 admin adminerror

特别注意admin前面一定要留一个空格。

6.当新的CVS管理员和帐户信息都准备好后,就要将/TestRep的帐户校验模式从“操作系统集成校验模式”修改为“仅使用CVS帐户校验”模式。这么做可以避免为了在CVS中使用多用户时需要操作Windows帐户的麻烦。这个设置的地方在CVSROOT目录中的config文件。打开客户端的config文件,将里面的#SystemAuth=yes改为SystemAuth=no(注意将#删除后,SystemAuth前不能有空格)。修改后保存config文件。

7.提交CVSROOT里的所有更新到服务器,我们的设置就生效了。命令如下所示:

cd CVSROOT
cvs add -m "" admin
cvs commit -m ""

不过在提交之前,你也许想先把CVSROOT的owner从原来的administrator修改为cvsadmin。使用命令cvs chown可以做到这一点。在提交了CVSROOT目录后,校验模式就立刻改变了,cvsadmin也同时开始生效。这时,用之前的 administrator就无法使用CVS了。我们改用cvsadmin帐户重新登陆,继续下面的操作。

8.修改读写权限。CVS有两种读写权限的设置方法,一是粗粒度的,一是细粒度的。只有CVS管理员才能进行访问权限的修改。粗粒度的方法是在 CVSROOT中添加readers或者writers文件来实现。在readers里添加的任何一个帐户对当前库只拥有读取权限,添加格式是每行一个帐户名。例如,我们在客户端的CVSROOT目录里添加readers文件,将之前的一个新建帐户anonymous放到里面,然后commit这个 readers文件到服务器。anonymous就不能进行commit了。实际的测试结果是在使用anonymous登陆之后执行commit指令,系统会报告正常执行完毕。但实际上,没有任何东西被commit,暴露了CVS在人机界面上的不完善。writers文件的操作readers完全一样。如果一个帐户名被同时写到两个文件里,此帐户只有只读权限。细粒度的方法是使用chacl命令。例如/TestRep里有3个工程,project1、 project2、project3。使用命令:

cvs chacl -u user1 -a none -d project1,project2,project3
cvs chacl -u user1 -a all -d project1
cvs chacl -u user1 -a read,write -d project2
cvs chacl -u user1 -a read -d project3

可以让user1拥有对project1目录的完全控制权,对project2目录的读写权,和对project3目录的只读权。第一条命令首先删除user1的所有权限,在随后的3条命令里分别设置了3个不同目录权限。

9.使用帐户组来组织帐户。在客户端的CVSROOT目录下添加一个叫group的文件。此文件的格式是:

组名1:用户名1,用户名2,用户名3,……
组名2:用户名5,用户名7,……
……

修改完group文件后commit它,然后通过chacl命令可以实现组权限的修改。


在布置CVS服务器过程中,我发现不同版本的CVSNT命令的选项和参数都有变化,所以我采用了直接修改资源库中配置文件的方法来实现多用户的权限设置,设置方法如下:

假设已经安装了WINCVS和CVSNT,并建立了仓库。完成了登陆和导入导出的操作。

(1)管理员登陆以后把服务器中仓库的CVSROOT目录(Module)导出(Checkout)到一个工作目录,比如“admin”。具体操作见“导出模块”。

CVS中目录权限介绍:

系统支持的目录权限如下:

r       (读取权限)

w       (写入权限)

c       (创建和删除权限)

n       (没有任何权限)

默认情况下,任何用户都拥有任何目录的所有权限。

任何情况下只有目录的拥有者和管理员才有权力更改目录的使用权限。下面将会介绍如何修改目录权限和目录的拥有者。

(2)对CVSROOT目录的管理:

CVSROOT目录是在创建仓库时有NTCVS建立的。里面包含了许多关于仓库的信息的文件。

认证口令的时候,服务器先检查 CVSROOT/passwd 文件中的用户。如果找到用户,就按CVS内置的权限管理方法进行认证。如果没有找到,或passwd 文件不存在,服务器将采用操作系统的用户认证机制。为安全起见,应该采用CVS内置的权限管理。具体方法如下:

     1)在服务端 CVSROOT 目录下建立文件passwd(不建立则在添加用户时自动创建)。出于安全考虑,默认不会将 passwd列在 checkoutlist 文件里面。既从客户端导出CVSROOT时不会导出该文件。在WINCVS中转到CVSROOT目录。点击主菜单“Admin->command line”或”ctrl+ L”弹出命令行对话框。在对话框中输入增加管理员的命令:

cvs passwd -a -r systemuser username

          //建立与系统用户systemuser有相同权限的用户,用户名为username。

          //当某个用户绑定的系统用户被删除时,则这个用户也不能登陆。

或  cvs passwd -a  username       

              //建立用户名为username的用户

在两次弹出的对话框输入密码。确认即可。这时可以看到passwd文件多了一行:

username:CUXQwLMdoZHNs:systemuser   

或     username:CUXQwLMdoZHNs

在增加管理员时,应该使用第一种方法:命令为:

cvs passwd -a -r Administrator username

在实际操作中建议使用第一种命令。采用第二种命令增加的用户有时在login时会出现不能登陆的情况(具体原因还不清楚)。

2)修改CVSROOT下的配置文件 config,加入一行:“ SystemAuth=no”其中no表示用passwd检查用户密码权限是否正确。yes 为默认值,表示如果用户在passwd文件中不存在,就用系统用户检查权限是否正确,这就使用了CVS内置的权限管理功能了。          

然后在CVSROOT下建立admin文件。这个文件是指定CVSNT的管理员列表的文件,CVSNT根据这个文件来判断一个用户是否是管理员。文件的内容是一个用户列表。如下:

user1

user2

user3

这些代表user1,user2,user3都是管理员,在此之前CVS将服务器的管理员用户作为自己的管理员用户的。

3)在CVSROOT下加入文件readers,writers来控制用户的读写权限。文件每行内容与admin文件相同。格式为: 用户名回车。

特别注意的是:只有在writer文件中的用户既能读取,又能进行提交修改。在readers中的用户只能读取,同时在两个文件中的用户只能读取。在 writers文件中必须有管理员的用户名。因为管理员在操作控制时将会涉及到文件的读写。对于一般用户就不要写进这两个文件了。

这样就完成了对CVSROOT目录的权限设定。不在readers和writers文件中的用户将不能导出CVSROOT这个module。仅在readers文件中的用户能进行导出操作但不能进行提交修改操作。仅在writers文件中的用户能进行导出和提交修改操作。

下面讲一下不使用系统管理员而自己建立的管理员的步骤:

1.              使用命令cvs passwd -a -r Administrator username建立一个和Administrator有相同权限的管理员用户。

2.              在admin文件中添加该管理员的用户名。

3.              在writers文件中添加该管理员的用户名。

4.              在config 文件中添加一行代码:SystemAuth=no,这样就不能使用Administrator而只能使用自己建立的管理员进行操作了。

 

(3)对一般目录权限的设置

1)  配置CVS库模块文件modules

先从客户端导入两个module。比如test和localdir。在modules加入如下3行:

     CVSROOT            CVSROOT 

     目录1    -a       localdir 

     目录2    -a       test

第一列为描述信息,第二列为参数或空格。第三列为相对路径。如果描述信息和相对路径不同则需要参数“-a”。

在导出模块的时候(remote->checkout module),可以点击module name and path on the server一栏旁边的“...” 按钮弹出窗口:


    这样可以使客户端更加方便的进行module选择。

 

2)  为各个module进行权限配置

module在仓库的下就是一个独立的目录。为module设置权限有两种方法。第一种是手工配置,在module目录下有一个子目录CVS,在里面有一个fileattr.xml文件。在未设置以前打开文件如下:

 

    Administrator

 

在< owner>之间设置目录的所有者。目录的拥有者和管理员才有权力更改目录的使用权限。目录权限未设置时,所有用户对目录有除了更改目录权限以外的全部权限。在之间加入以下代码表示取消所有用户对目录的的默认全部权限。

     

   

之间加入以下代码表示用户user具有创建、读写、注释的权限。目录的所有者也要通过以下代码进行权限设置。

       

         

         

         

         

       

加入以上代码以后文件如下:

 

         

   

         

         

         

         

       

    user

 

第二种方法是使用命令来设置,其实也是通过命令来修改fileattr.xml文件来进行权限设置。具体方法是在WINCVS中用管理员身份登陆并导出要设置的module。选中module,在文件信息栏显示module的文件信息。打开命令行对话框输入以下命令来设置。

命令格式:

cvs chacl [-R] [-r branch] [-u user] [-j branch] [-n] [-p priority] [-m message] [-a [no]{read|write|create|tag|control|all|none}[,...]] [-d] [file or directory...]

    -a access    Set access(设置权限)

    -d        Delete ACL(删除目录的控制权限)

    -j branch    Apply when merging from branch(合并分支时应用)

    -m message    Custom error message(定制错误消息)

    -n        Do not inherit ACL

    -p priority    Override ACL priority(不受目录权限管理)

    -r branch    Apply to single branch(在单个分支上应用)

    -R        Recursively change subdirectories(嵌套设置权限,对目录下每个子目录也进行相同的目录权限设置)

    -u user        Apply to single user(应用在单个用户)

例如  cvs chacl -r –a none //取消所有用户的默认权限,禁止一切访问。

cvs chacl -R -u user -a read    //设置用户user有读的权限。

通过下面的代码更改目录所有者:

cvs chown dirowner //dirowner为要设定的管理员     

通过下面的代码显示目录的信息:

cvs lsacl

这两种方法中,第二种方法比较简单,不容易出错。但在第二种方法没有效果的时候可以用第一种方法进行设置。第一种方法中的命令和以前的版本略有不同。具体见它的格式。

    以上就可以完成对目录的权限设置。在模块(module)下的每一个目录下都会自动产生一个名为CVS的文件夹,里面都有一个fileattr.xml文件用来控制目录的访问权限。方法同上。

 

(3)关于分组(group)的应用

分组:将权限相同的用户划分到一组,这样可以方便维护。就是角色的意思,分组使用在对模块访问权限的划分的方法如下:

a.在服务器端 CVSROOT目录下新建文件 group。

b.在文件中建立分组,group文件内容如下:

group1:user1 user2 user3

group2:user5 user6 user7

c.之后对组进行权限划分,和对单个用户方式一样,就可以使组内用户和组具有相

同的权限,如 选中模块,执行如下命令可以使用户 user1 user2 user3 同时具有对该模块的读权限了。

  cvs chacl -R -u group1 -a write

在fileattr.xml文件中加入如下代码也可以使用户 user1 user2 user3 同时具有对该模块的读写:

         

         

         

         

       

注意这里的group不用" " 。
阅读(2695) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~