朋友昨天问我一个问题,他公司使用的vpn连接的svn,使用svn管理软件进行svn update是可行的,使用命令行svn update出错,svn status可行。
思路1:
刚开始我关注的焦点都在vpn上,以为是软件与svn有绑定,而命令行没有绑定。搜索了百度百科,大致了解了什么叫vpn。我的理解就是一个中介装置,外部的网络想要访问公司内部的网络,不可以直接访问,通过一个中转服务器,由中转服务器负责将请求转到内网。中转服务器就是vpn服务器,它有两个网卡,一个负责和公司内部网络交互,一个负责和外部网络交互。如果我在外地出差,在我的机器上配置好vpn服务器的ip,那么我的请求就可以通过vpn服务器的中转到达公司内部,从而间接访问内网资源,我的机器和vpn服务器和内网看起来相当于一个局域网一样,因此叫做虚拟局域网。vpn服务器不仅仅可以转发功能,还可以通过它进行传输加密,像隧道一样。经过分析发现,vpn和svn管理软件没有任何关系,vpn提供的是一种进入某一个私有网络的方式,关注的焦点都在svn命令行和管理软件的区别上了。
思路2:
svn status是比较本地版本和.svn的本地版本的差别,此命令不需要网络的支持,svn update,svn commit需要网络的支持,再次执行svn co命令也不行,可以基本确定是svn命令行与svn服务器的沟通有问题。后来他qq发过来svn update命令的出错信息:Cannot negotiate authentication mechanism。当时我信息就在想,怎么不早点说呢?
思路3:
google搜索Cannot negotiate的相关问题,基本出奇的一致,需要安装sasl2_md5的什么东西,由于他的是mac os的系统,不支持网上centos通吃的yum install的方式,下载了sasl2的源码,编译出lib库,还是没能解决问题。不过问题基本明朗了,和vpn没有关系,主要是svn管理软件支持sasl2加密传输,而命令行不支持,于是想到升级svn命令行,升级到svn1.7,问题完美解决。
弄完这个问题之后,对如何配置svn服务器有了些兴趣,就参照网上的一些教程配置了svn服务器,系统是ubuntu10.04。
1,安装svn,兼具客户端和服务器功能
sudo apt-cache search svn
sudo apt-get install subversion
2,创建repository
svnadmin create test_repos
这个命令会在当前文件夹下生成test_repos目录,主要关注此目录下的conf目录下的文件
3,更改配置文件,设定用户名和密码
cd test_repos/conf
vim passwd
添加一行用户名=密码,例如test=test
vim svnserve.conf
去掉password-db = passwd的注释
去掉realm = myrealm的注释
4,导入要管理的基础文件
logfiles_for_svn_server为我自己随意设置的一个目录,便于svn测试使用的。
svn import logfiles_for_svn_server/ svn://localhost/test_repos -m "this is my first repositionary?"
这句的意思是将logfiles_for_svn_server目录导入到上面的test_repos链接中。
5,启动服务器
svnserve --daemon --root .
以当前目录作为根目录,checkout的时候可以直接svn co svn://localhost/test_repos/就可以下载了。
6,测试当前的test_repos
mkdir test_client
cd test_client
svn co svn://localhost/test_repos/
不使用密码方式,使用
sasl2进行认证加密传输,写了以下几个脚本便于操作.
比上面多了一个步骤,需要配置sasl2
1,更改svnserve.conf文件,使能sasl2
cd test_repos/conf
vim svnserve.conf
修改sasl2的配置如下:
[sasl]
use-sasl = true
min-encryption = 128
max-encryption = 256
主要是使能sasl,设置加密的密钥长度,可以看到如果启动了sasl,那么password-db = passwd将变成无效,因此可以不用管它。
2,创建svn,conf,设置sasldb的路径
cd /usr/lib/sasl2
sudo vim svn.conf
添加:
pwcheck_method: auxprop
auxprop_plugin: sasldb
sasldb_path: /usr/lib/sasl2/sasldb
mech_list: DIGEST-MD5
此步骤需要确保你有libsasl*.so库,一般处于的目录是/usr/lib/sasl2,如果没有需要安装sasl2库。
sudo apt-get install sasl2-bin libsasl2-2 libsasl2-modules libsasl2-modules-sql。
进入/usr/lib/sasl2目录,创建svn.conf文件,文件主要设置加密算法和加密的db路径。
3,创建sasldb数据库文件,存储用户名和密码
设置realm的用户名和密码,myrealm取自于repository的conf目录的svnserve.conf的配置文件。
cd /usr/lib/sasl2
sudo apt-get install sasl2-bin
sudo saslpasswd2 -c -f /usr/lib/sasl2/sasldb -u myrealm test
用户名为test,密码会提示用户输入
4,重新启动服务器,注意不是以root方式启动会导致读取svn.conf失败
killall svnserve
svnserve --daemon --root .
5,如果出现svn客户端checkout时用户名密码错误,那可能是配置文件的权限问题。
cd /usr/lib/sasl2
sudo chmod 777 sasldb svn.conf
将配置文件设置完全的访问权限,使能libsasl2.so可以正常读取
客户端通过svn co svn://192.168.1.122/test_repos/就可以正常下载了。客户端必须支持sasl2.
上传的文件