2019.03.20
我想在ubuntu下安装一个SVN服务器。同样,没有一个资料没问题的,通过对比,总结,尝试,终于找到对的方法。
老规矩,#顶格或前面没有#的是要执行的命令,#****是要手工操作的步骤,其他是注释
###############################################################################################
#!/bin/bash
cur_user=${USER}
temp_file_path=/home/${cur_user}/temp_file
svn_root=/home/svn
project1=yf
project2=sc
user_1=h
user_2=x
user_3=y
user_4=l
groups_1=f1
groups_2=f2
groups_3=f3
groups_4=f4
mkdir -vp ${temp_file_path}
# https://www.cnblogs.com/lovechen/p/5716213.html 《SVN服务器在Ubuntu16.04下搭建多版本库详细教程》
# https://blog.csdn.net/sm_wang/article/details/78656120 《Ubuntu16.04 搭建svn》
# https://blog.csdn.net/zengsange/article/details/80618301 《Ubuntu 搭建SVN服务器(SVN Server)》
#1.安装svn,创建svn主目录,要改成当前用户,否则svnadmin执行有问题。
# sudo apt-get install subversion
# sudo apt-get remove --purge subversion # --purge这个参数的意思清除干净,配置文件等都删除掉。
# sudo mkdir -vp ${svn_root}
# sudo chown -R ${cur_user}:${cur_user} ${svn_root}
# svnserve --version #安装好之后 查看是否安装成功
#2.创建版本库 注意${project1}和${project2}都是独立的版本库啊。可以用这个方法创建多个,后面重新启动SVN就可以了。
#创建第一个项目${project1}
# mkdir -vp ${svn_root}/${project1}
# svnadmin create ${svn_root}/${project1}
#创建第一个项目${project2}
# mkdir -vp ${svn_root}/${project2}
# svnadmin create ${svn_root}/${project2}
#3.配置
# echo "
# 设置\${svn_root}/\${project1}项目使用哪些权限文件。
# 打开${svn_root}/${project1}/conf/svnserve.conf,按照下面的方法设置:(去掉前面的#,并且顶格,不然可能会报错)
# 匿名用户可读
# anon-access = read(可改成none,即不可读)
# 权限用户可写
# auth-access = write
# 密码文件为passwd
# password-db = passwd
# 权限文件为authz
# authz-db = authz
#
# 还可以这样:password-db = ../../passwd authz-db = ../../authz 就是说passwd和authz,不是非要在\${svn_root}/\${project1}/conf下,可以在其他位置。上面的方法指定的位置就是在\${svn_root}下。
# 在vim的命令模式输入:n,进入${svn_root}/${project1}/conf/svnserve.conf文件
# " > ${temp_file_path}/temp_file.txt ; vim ${temp_file_path}/temp_file.txt ${svn_root}/${project1}/conf/svnserve.conf
# echo "
# 给\${svn_root}/\${project1}项目添加用户和密码
# 打开${svn_root}/${project1}/conf/passwd,按照下面的方法设置: 记得“=”前后的空格
# [users]
# # harry = harryssecret
# # sally = sallyssecret
# ${user_1} = 123456 #设定用户${user_1}的密码是123456,是的没错,密码是明文的。 这样就给SVN添加一个用户,同时也设置了密码。
# ${user_2} = 123456
# ${user_3} = 123456
# ${user_4} = 123456
# 在vim的命令模式输入:n,进入${svn_root}/${project1}/conf/passwd文件
# " > ${temp_file_path}/temp_file.txt ; vim ${temp_file_path}/temp_file.txt ${svn_root}/${project1}/conf/passwd
# echo "
# 定义权限组,并且给每个文件夹分配权限组。
# 打开${svn_root}/${project1}/conf/authz,按照下面的方法设置:
# [groups]
# ${groups_1} = ${user_1} ##(1)定义一个权限组,同时指定在passwd定义的哪些用户属于这个组。如果指定多个用户,用','隔开。
# ${groups_2} = ${user_1},${user_2}
# ${groups_3} = ${user_3},${user_4}
# ${groups_4} = ${user_1},${user_2},${user_3},${user_4}
##[svnroot:/] ##(2)下面sudo svnserve -d -r ${svn_root}命令,指定了svnroot的位置。 这里有一个疑问:svnroot的路径是${svn_root},库在${svn_root}/${project1},即${svn_root}下面,而authz和passwd都在${svn_root}/${project1}/conf,确定passwd的用户能访问在${svn_root}/${project1}上面的${svn_root}目录吗? 应该不行,最多访问到${svn_root}/${project1} 所以这部分设置是不能要的,除非authz和passwd在${svn_root}下面
##${groups_1} = rw ##(3)admin_groups这个组在svnroot文件夹下组拥有哪些权限。这里指定admin_groups权限组在svnroot文件夹下拥有的权限是读和写
##${groups_2} = r ##manage_group只有读权限。
##${groups_3} = r
#
# [${project1}:/]
# @${groups_1} = rw ##manage_group权限组拥有读写权限。 (4)指定组前面必须加上@,如果是单个用户则不需要@
# * = r ##(5)意思是所有权限组,包括admin_groups,manage_group,都有拥有这个文件夹的读权限。
# [${project1}:/product1] ##(6)可以给任意一个文件夹重新分配权限。权限有继承性,子文件夹能够继承权限,如果不重新设置文件夹的权限,那么继承主文件夹的权限。
# @${groups_2} = rw
# * = ##(7)意思是其他所有权限组都没有这个文件夹的读写权限。
##[${project2}:/] ##这里有一个疑问:${svn_root}/${project1}/conf下的authz和passwd设置的用户确定能访问另一个库吗?应该不行吧? 所以${project2}相关的设置是不能要的
##@${groups_3} = rw
##* = r
##
##[${project2}:/product2]
##@${groups_4} = rw
##* =
# 在vim的命令模式输入:n,进入${svn_root}/${project1}/conf/authz文件
# " > ${temp_file_path}/temp_file.txt ; vim ${temp_file_path}/temp_file.txt ${svn_root}/${project1}/conf/authz
补充说明:[repos:/file1/file2]
repos:svnadmin create创建的库名。
/file1/file2:在这个库下面的任何路径。注意不能有空格字符,否则会出问题。
# 设置db的权限
# sudo chmod -R 777 ${svn_root}/${project1}/db
#4.启动SVN服务器
# sudo svnserve -d -r ${svn_root}
# -d:表示在后台运行
# -r:指定服务器的根目录
# sudo killall svnserve #停止svn服务
#5.查看svnserve是否已经运行
# ps aux | grep svnserve #(1)好像安装完,执行这条命令就会有显示。 这条有显示,SVN服务器不一定行
# sudo netstat -antp |grep svnserve #(2)只有执行了sudo svnserve -d -r ${svn_root},服务正常启动,执行这条命令才会有输出,这有这条命令有输入,SVN服务器才能用。
#6.打开SVN
#**** 点击右键-->TortoiSVN-->Repo-browser-->URL:svn://10.10.60.92/${project1}
#(3)如果电脑已经打开过其他服务器的SVN,那么先退出原来的账号,才能登陆上面启动的SVN。退出原来的账号的方法是:
#**** 点击右键-->TortoiSVN-->Settings-->Saved Data-->Authentication data-->Clear all。
# 由于SVN允许任何人看,所以客户端没有登陆也能打开,能下载文件。没有账户,那么Authentication data后面的Clear all是灰色。
#(4)由于SVN允许任何人看,上面anon-access = read,所以客户端没有登陆也能打开,能下载文件。但是上传(就是写权限),就要求输入账号和密码,并记录账号和密码,下次就不用输了,除非用上面的方法删除账号和密码。
#6.SVN自动启动
# echo "#!/bin/bash
# svnserve -d -r ${svn_root}
# " > ${temp_file_path}/startsvn.sh
# sudo cp -vf ${temp_file_path}/startsvn.sh /etc/init.d/
# sudo chmod a+x /etc/init.d/startsvn.sh
# cd /etc/init.d && sudo update-rc.d startsvn.sh defaults
#7.http服务器安装
#https://blog.csdn.net/stickmangod/article/details/85315971 《ubuntu搭建SVN服务器+Apache 实现http访问》
#https://blog.csdn.net/hjq842382134/article/details/47752225 《SVN服务器搭建01---Apache2搭建(Ubuntu14.04)》
# 能装的都装上,不管有没有用。
# sudo apt-get install apache2-dev apache2 apache2-utils
# 重启apache2
# sudo /etc/init.d/apache2 restart
# 卸载Apache2
# sudo apt-get --purge remove apache-common
# sudo apt-get --purge remove apache
# 找到没有删除掉的配置文件,一并删除
# sudo find /etc -name “apache” |xargs rm -rf
# sudo rm -rf /var/www
# sudo apt-get autoremove
# ps:这样会删的很干净
# 打开浏览器,输入网址:
#**** http://localhost
#8.建立起apache与svn之间的连接,并授予了相关权限
#下载svn服务,以及 apache2-svn链接库
# sudo apt-get install subversion libapache2-svn
#为apache用到的www-data添加权限,可以http访问。改了账户也没关系,原来的账户还是可以访问的。svn://10.10.60.92/${project1}也能用
# sudo chown -R www-data:www-data ${svn_root}
#9.实现http访问
# echo "
# 修改apache2配置文件
# 打开/etc/apache2/mods-available/dav_svn.conf,添加下面的内容:
#
# <Location /svn>
# DAV svn
# SVNParentPath ${svn_root}
# AuthzSVNAccessFile ${svn_root}/${project1}/conf/authz
# AuthType Basic
# AuthName \"Subversion Repository\"
# AuthUserFile ${svn_root}/${project1}/conf/http_passwd
# Require valid-user
# </Location>
#
# 这里有几点需要注意:
# 1./svn 意思是你可以通过http://localhost/svn来访问该资源
# 2.SVNParentPath 代表这该资源的实际位置,这个名字不要错啊,有些网站资料是错的。
# 3.AuthzSVNAccessFile 代表着访问权限的设置文件
# 4.AuthUserFile 代表着用户和密码的配置文件
# 5.\"Subversion Repository\"名字可以随便定义,没错吧?实际是不需要斜杠的,有双引号就行了,因为现在是通过echo写入文件,所以加斜杠。
#
# 在vim的命令模式输入:n,进入/etc/apache2/mods-available/dav_svn.conf文件
# " > ${temp_file_path}/temp_file.txt ; sudo vim ${temp_file_path}/temp_file.txt /etc/apache2/mods-available/dav_svn.conf
# 创建http下的svn账户和密码。 注意的是:
# (1)不要听网上有的人说的那样,手工创建http_passwd配置文件,那样是不行的,必须通过htpasswd命令
# (2)其实和上面的passwd和authz一样,http_passwd放哪里都行,通过/etc/apache2/mods-available/dav_svn.conf文件的AuthUserFile指定http_passwd的位置。
# (3)http_passwd的用户名和密码跟${svn_root}/${project1}/conf/passwd文件的用户名和密码完全没有关系,完全可以新建,用网页打开svn时,输入http_passwd配置的用户名和密码。
# (4)不过和${svn_root}/${project1}/conf/passwd一样,可以创建多个,每一个用户都要使用htpasswd创建,账号和密码最好和SVN的passwd文件件里面的账号和密码一样
# sudo rm -vf ${svn_root}/${project1}/conf/http_passwd #加-c参数,就重新创建文件,所以不用删除
# cd ${svn_root}/${project1}/conf && sudo htpasswd -c http_passwd ${user_1} #首个用户必须指定 -c 用于新建文件http_passwd。
# cd ${svn_root}/${project1}/conf && sudo htpasswd http_passwd ${user_2} #后续用户必须不要指定 -c, 否则文件会被新建;-m 表示以 md5 加密密码
# cd ${svn_root}/${project1}/conf && sudo htpasswd http_passwd ${user_3} #每创建一个用户,执行一次htpasswd命令
# cd ${svn_root}/${project1}/conf && sudo htpasswd http_passwd ${user_4}
# 终端里面输入密码:
# New password:
# Re-type new password:
# Adding password for user ${user_1}
# sudo chown -R www-data:www-data ${svn_root} #把刚才创建的${svn_root}/${project1}/conf/http_passwd文件,改成www-data用户。
#10.访问
# sudo /etc/init.d/apache2 restart #会失败,难道我打开了浏览器,我没有关闭?原来是http_passwd有问题,才会重启失败
# 打开浏览器,输入:
#**** http://10.10.60.92/svn/${project1}
# 对话框:
# Authentication Required
# A username and password are being requested by http://localhost. The site says: "Subversion Repository"
#**** User Name:(sudo htpasswd http_passwd ${user_1}这条命令设置的用户名)
#**** Password:(上面那条命令设置的密码)
###############################################################################################