svnserve 是一个轻量级的服务, 使用自定义的协议通过TCP/IP与客户端通讯。
客户端通过由 svn:// 或者 svn+ssh:// 开始的URL访问svnserve服务器。
启动服务器
端口监控(inetd)模式
如果你打算用端口监控来启动处理客户的访问请求的进程,你可以通过传入参数-i来启动:
svnserve -i
当使用-i参数启动服务的时候,svnserve通过stdin和stdout用自定义协议和客户端
通讯。同时服务侦听3690端口。
独立端口监控进程
使用参数-d启动服务作为一个独立的端口监控进程。
svnserve -d
当运行svnserve在独立端口监控模式时,你可以使用--listen-port=和--listen-host=参数来自定义需要的端口和主机名称。当前模式默认的端口是3690。
当然,也有第三种方法启动svnserve,也就是使用“隧道模式”,使用-t参数启动服务。这个模式要求远程服务程序,如RSH或SSH,已经成 功验证用户,并且使用已经校验的用户启动一个属于该用户的svnserve进程。当使用该模式提供服务时,要确认启动的用户帐户具备对 Repository的读/写权限。
设置项目目录
当svnserve开始运行时,它将会暴露所有的Repository到网络上。不过,当客户端需要获取一个Repository的内容时,需要指定Reopsitory的绝对路径。例如:一个Repository放在文件路径
C:/Project Repository/Project1
那么当客户端访问时,需要指定绝对路径:
svn://host/C:/Project Repository/Project1
所以,为了增加保密性,你可以使用参数-r指定需要暴露的Repository的路径,当用户访问时,只需指定Repository的名称即可。例如上面的Repository,当启动服务时,使用如下的方法:
svnserve -d -r C:/Project Repository
那么当客户端访问时,则使用
svn://host/Project1
就可以获取数据了。
内置的验证和授权
当客户端连接到一个svnserve进程时,下面的流程就会触发:
1、客户选择一个指定的Repository;
2、服务处理Repository的配置文件 conf/svnserve.conf文件,并且开始执行在其中定义的所有验证和授权策略;
3、依赖与情形和授权策略:
a)客户端也许允许匿名访问而不需要验证,或者
b)客户但也许需要在任何时候被要求验证,或者
c)假如处于"隧道模式"中,客户端将声明自己已经可以被外部验证。
很显然,如上所说,用户文件是一个名为svnserve.conf的,放在conf目录下的文件。
现在我们来看看如何配置这个文件:
这个配置文件放置在Repository的目录中的conf目录下,它有两个节点:
[general]
[users]
其中,[general]的配置信息有:
anon-access = read
auth-access = write
其中表示对于验证有效的以及没通过验证的用户可以做什么事情。分别有read, write和none
[users]的标签的配置内容有:
USERNAME = PASSWORD
password-db = passwd
realm = My First Repository
其 中表示,用户名对应的密码是什么,或者指定一个存储用户名和密码的文件的相对或绝对路径以及指定了Repository的验证领域。如果两个 Repository有相同的验证领域,那么它们应该有相同的密码数据库,反之亦然。默认的领域就是指向当前的Repository的路径,与服务器的 Repository的根目录相关。
svnser配置实例
svnserve是SVN自带的一个轻型服务器,客户端通过使用以svn://或svn+ssh://为前缀的URL来访问svnserve服务器,实现远程访问SVN版本库。
svnserve可以通过配置文件来设置用户和口令,以及按路径控制版本库访问权限。本文详细分析了svnserve配置文件格式,并说明如何使用配置文件控制版本库访问权限。
1) svnserve配置文件概述
svnserve配置文件通常由以下3个文本文件组成:
svn服务配置文件,该文件版本库目录的conf目录下,文件名为svnserve.conf。
用户名口令文件,该文件名在文件svnserve.conf中指定,缺省为同目录下的passwd。
权限配置文件,该文件名也在文件svnserve.conf中指定,缺省为同目录下的authz。
2) svn服务配置文件
svn服务配置文件为版本库目录中的文件conf/svnserve.conf。该文件仅由一个[general]配置段组成。
[general]配置段中配置行格式如下:
<配置项> = <值>
配置项分为以下5项:
anon-access 控制非鉴权用户访问版本库的权限。取值范围为"write"、"read"和"none"。
即"write"为可读可写,"read"为只读,"none"表示无访问权限。
缺省值:read
auth-access 控制鉴权用户访问版本库的权限。取值范围为"write"、"read"和"none"。
即"write"为可读可写,"read"为只读,"none"表示无访问权限。
缺省值:write
password-db 指定用户名口令文件名。除非指定绝对路径,否则文件位置为相对conf
目录的相对路径。
缺省值:passwd
authz-db 指定权限配置文件名,通过该文件可以实现以路径为基础的访问控制。
除非指定绝对路径,否则文件位置为相对conf目录的相对路径。
缺省值:authz
realm 指定版本库的认证域,即在登录时提示的认证域名称。若两个版本库的
认证域相同,建议使用相同的用户名口令数据文件。
缺省值:一个UUID(Universal Unique IDentifier,全局唯一标示)。
【说明】版本库认证域
在使用svn客户端访问svnserve服务器时,若需要用户登录,则提示信息如下:
[root@test root]# svn list svn://192.168.3.45/test
Authentication realm: 0d545a49-4038-0410-99b4-c66dc73f754e
Password for 'root':
在上述第2行"Authentication realm: "之后显示的字符串为认证域名称。如果在配置文件中为设定认证域,就会提示一个UUID,如上述所示。
如果在配置文件中指定了如下配置项:
realm = test
将在svn客户端提示如下:
[root@test root]# svn list svn://192.168.3.45/test
Authentication realm: test
Password for 'root':
例1:svn服务配置文件conf/svnserve.conf的内容如下:
[general]
anon-access = none
auth-access = write
password-db = ../../conf/passwd
authz-db = ../../conf/authz
realm = test
上 述配置文件设定非鉴权用户无权限访问该版本库;鉴权用户可对版本库进行读写;用户名口令文件为相对版本库conf目录的文件"../../conf /passwd";权限配置文件为相对版本库conf目录的文件"../../conf/authz";版本库的认证域为"test"。
3) 用户名口令文件
用户名口令文件由svnserve.conf的配置项password-db指定,缺省为conf目录中的passwd。该文件仅由一个[users]配置段组成。
[users]配置段的配置行格式如下:
<用户名> = <口令>
注意:配置行中的口令为未经过任何处理的明文。
例2:用户名口令文件conf/passwd的内容如下:
[users]
admin = admin
thinker = 123456
该文件中配置了两个用户,用户名分别为"admin"和"thinker"。其中"admin"用户的口令为"admin";"thinker"用户的口令为"123456"。
4) 权限配置文件
权限配置文件由svnserve.conf的配置项authz-db指定,缺省为conf目录中的authz。该配置文件由一个[groups]配置段和若干个版本库路径权限段组成。
[groups]配置段中配置行格式如下:
<用户组> = <用户列表>
用户列表由若干个用户组或用户名构成,用户组或用户名之间用逗号","分隔,引用用户组时要使用前缀"@"(如:引用用户组"all"要使用字符串"@all")。
版本库路径权限段的段名格式如下:
[<版本库名>:<路径>]
如版本库abc路径/tmp的版本库路径权限段的段名为"[abc:/tmp]"。
可省略段名中的版本库名。若省略版本库名,则该版本库路径权限段对所有版本库中相同路径的访问控制都有效。如:段名为"[/tmp]"的版本库路径权限段设置了所有引用该权限配置文件的版本库中目录"/tmp"的访问权限。
版本库路径权限段中配置行格式有如下三种:
<用户名> = <权限>
<用户组> = <权限>
* = <权限>
其中,"*"表示任何用户;权限的取值范围为''、'r'和'rw',''表示对该版本库路径无任何权限,'r'表示具有只读权限,'rw'表示有读写权限。
注意:每行配置只能配置单个用户或用户组。
例3:权限配置文件conf/authz的内容如下:
[groups]
g_admin = admin,thinker
[admintools:/]
@g_admin = rw
* =
[test:/home/thinker]
thinker = rw
* = r
在 上述配置文件中,定义了一个用户组"g_admin",该用户组包含用户"admin"和"thinker"。然后定义了2个版本库路径权限段。其中,版 本库"admintools"只有用户组"g_admin"可读写,其他用户无任何权限;版本库"test"中路径"/home/thinker"只有用 户"thinker"有读写权限,其他用户只有可读权限。
5) 总结
在本文中,详细介绍了svnserve程序的3个配置文件。SVN管理员可以通过这3个配置文件设置svnserve服务的用户名口令,以及对版本库路径的访问权限。这些配置文件保存后就立即生效,不需要重启svnserve服务。
需要强调的是本文介绍的配置文件只对svnserve服务有效,即客户端通过前缀为svn://或svn+ssh://的URL访问版本库有效,而对通过前缀http://、https://或file:///的URL无效。
6)、总结与提高
错误搞定后,接下来就是比较轻松但乏味的事情了,创建公司员工一大堆成员的用户名和密码。
比较重要的三个配置文件:
passwd: 用户名和密码存放位置。
auth.conf: 每个用户授予权限。
svnserve.conf: SVN的配置文件
先说这三个文件的位置:
在创建仓库时,其目录下有一个名为conf的文件夹,下面有authz, passwd, svnserve.conf三个文件,由于上面是Apache+SVN的方式,所以不使用其下面的authz和passwd,只使用svnserve.conf。
而实际使用的auth.conf和passwd是在添加用户和权限分配时创建并指定其位置。
passwd在上面第6步(1,创建用户)指定。passwd是自动生成的,无需手动改动。
auth.conf在上面第6步(2,权限分配)创建。auth.conf需手动添加内容。
注:上面第5步引用了其位置,所以需第5步与之保持一致。
下面对实际使用的三个配置文件稍作讲解:
1,passwd
是由Apache命令创建后自动生成的,不要直接改动。
2,auth.conf
给每个用户授予权限。详细解释,可能会因人而异,但本质上大同小异。
[groups] /*这个表示群组设置
Admin=usr1,user2 /*这个表示admin群组里的成员user1,user2
Develop=u1, u2 /*这个表示Develop群组里的成员 u1,u2
[www:/] /*这表示,仓库www的根目录下的访问权限
user1 = rw /*www仓库user1用户具有读和写权限
user2 = r /* www仓库userl用户具只有读权限
@develop=rw /*这表示 群 develop的成员都具有读写权限
[/] /*这个表示在所有仓库的根目录下
* = r /*这个表示对所有的用户都具有读权限
3,svnserve.conf
(注:第一次配置时,直接按最下面的例子,去掉注释就ok了)
每个代码仓库都有一个 svnserve.conf 文件来控制 svnserve 守护进程的行为。这个文件位于仓库的 conf 子目录。文件的结构与 Subversion 用户配置文件的结构类似。顶层是段落 (section),以方括号中的词指定;每个段落之中是 ``variable=value'' 形式的变量定义。以 `#' 开头的行被忽略。svnserve.conf 当前只使用一个段落,称为 ``general'',并且支持如下变量:
anon-access = none|read|write
决定非授权用户的访问级别。write访问允许所有的仓库操作。read 访问允许所有操作,除了提交和修改版本属性。none 不允许任何访问。默认级别是 read。
auth-access = none|read|write
决定授权用户的访问级别,使用与上面相同的访问级别。默认级别是 write。
password-db = filename
设置密码数据库的位置。filename可能是相对仓库中 conf 目录的位置。没有默认值。密码数据库的格式与本文件相似。它只有一个段落 ``users'';段落中的每个变量是一个用户名,每个值是一个密码。
realm = realm-name
设置仓库的授权域(realm)。如果两个仓库拥有相同的密码数据库,它们应当在同一个域中,反之亦然;这样的关联可以允许客户端为多个仓库使用单一的密码缓存。默认域的值是仓库的路径,相对于服务器进程的虚根目录。
例子:
[general]
anon-access = none
auth-access = write
password-db = /svn/passwd
authz-db = /svn/auth.conf
realm = My First Repository
上述配置文件设定非鉴权用户无权限访问该版本库;鉴权用户可对版本库进行读写;用户名口令文件为相对版本库conf目录的文件"/svn/passwd ";权限配置文件为相对版本库conf目录的文件"/svn/auth.conf";版本库的认证域为"My First Repository"。
最后附注:
<Location /svn>
DAV svn
SVNParentPath /svn/project (此处配置你的版本库根目录)
AuthType Basic (连接类型设置 基本验证)
AuthName "Hello welcome to here" (此处字符串内容修改为提示对话框标题)
AuthUserFile /svn/passwd (此处修改为访问版本库用户的文件,用apache 的htpasswd命令生成)
AuthzSVNAccessFile /svn/auth.conf (此处修改为访问版本库权限的文件)
Require valid-user ("Requirevalid-user"告诉apache在authfile中所有的用户都可以访问。如果没有它,则只能第一个用户可以访问新建库)
</Location>
官方参数说明
svnserve
当对远程源版本库使用svnsync时,使用Subversion的自定义网络协议。
svnserve允许Subversion版本库使用svn网络协议,你可以作为独立服务器进程运行svnserve,或者是使用其它进程,如inetd、xinetd(也是svn://)或使用svn+ssh://访问方法的sshd为你启动进程。
一 旦客户端已经选择了一个版本库来传递它的URL,svnserve会读取版本库目录的conf/svnserve.conf文件,来检测版本库特定的设 置,如使用哪个认证数据库和应用怎样的授权策略。关于svnserve.conf文件的详情见“svnserve,一个自定义的服务器”一节。
svnserve选项
不象前面描述的例子,svnserve没有子命令—svnserve完全通过选项控制。
--daemon (-d)
导致svnserve以守护进程方式运行,svnserve维护本身并且接受和服务svn端口(缺省3690)的TCP/IP连接。
--listen-port=PORT
在守护进程模式时导致svnserve监听PORT端口。(FreeBSD守护进程缺省只监听tcp6—这个选项告诉他们监听tcp4。)
--listen-host=HOST
svnserve监听的HOST,可能是一个主机名或是一个IP地址。
--foreground
当与-d一起使用,会导致svnserve停留在前台,主要用来调试。
--inetd (-i)
导致svnserve使用标准输出/标准输入文件描述符,更准确的是使用inetd作为守护进程。
--help (-h)
显示有用的摘要和选项。
--version
显示版本信息,版本库后端存在和可用的模块列表。
--root=ROOT (-r=ROOT)
设置svnserve服务的版本库的虚拟根,客户端提供的URL中显示的路径会解释为这个根的相对路径,不会允许离开这个根。
--tunnel (-t)
导 致svnserve以管道模式运行,很像inetd操作的模式(两种模式都维护标准输入/标准输出的连接),除了连接是用当前uid的用户名预先认证过的 这一点。这个选项在客户端使用如ssh之类的管道时自动传递,这意味着你很少有必要再去传递这个参数给svnserve,所以如果你发现在命令行输入了 svnserve --tunnel,并想知道接下来怎么做,可以看“SSH 隧道”一节。
--tunnel-user NAME
与--tunnel选项结合使用;告诉svnserve假定NAME就是认证用户,而不是svnserve进程的UID用户,当希望多个用户通过SSH共享同一个系统帐户,但是维护各自的提交标示符时非常有用。
--threads (-T)
当以守护进程模式运行,导致svnserve为每个连接产生一个线程而不是一个进程,svnserve进程本身在启动后会一直在后台。
--listen-once (-X)
导致svnserve在svn端口接受一个连接,维护完成它退出。这个选项主要用来调试。