花了将近2个小时写,边学习边写这个逻辑,后面就优化(请先自行安装svnversion):
#!/bin/bash echo "欢迎上使用svn账户配置脚本" echo "当前版本V1.0.0" echo "作者:blog.alipay168.cn" echo "=============================" echo "=============================" echo "==== 君子慎独,不欺暗室 ===" echo "=============================" echo "=============================" echo -e "\n\n配置流程如下\n0.软件检测\n1.定义目录相关\n2.定义auzhz配置\n3.定义账号密码\n4.定义svnserve权限\n5.定义回调监听hook\n6.配置监听端口\n\n" echo -e "开始进入配置:\n=====================\n" svnsoft='svnadmin' if ! type ${svnsoft} >/dev/null 2>&1; then echo "${svnsoft} 未安装,请先运行ubuntu类:apt-get install subversion 或者centos系统:yum install subversion...安装svn服务" exit else echo -e "${svnsoft} 已安装,可以进行下一步配置\n" fi #定义一些基本的变量 tmp_dir_svn="tmpsvn" rm -rf $tmp_dir_svn mkdir $tmp_dir_svn #检测一下目录是否存在了 if [ ! -d $tmp_dir_svn ]; then echo '目录当前无权限操作' exit fi tmp_file_port="${tmp_dir_svn}/port" tmp_file_authz="${tmp_dir_svn}/authz" tmp_file_passwd="${tmp_dir_svn}/passwd" tmp_file_serve="${tmp_dir_svn}/svnserve.conf" tmp_file_hook="${tmp_dir_svn}/post-commit" echo "请输入svn版本控制目录,如/svn/project1/" read svn_dir #fixme 如果是根目录需要做判断,避免删除整个系统 if [ -d "$svn_dir" ]; then echo "${svn_dir}目录已存在,是否强制删除目录,是输入1,否则终止执行:" read delc if [ "$delc" -eq 1 ]; then echo "正在执行删除${svn_dir}目录..." rm -rf "$svn_dir" else echo "您已取消配置!" exit fi fi echo "正在创建目录:${svn_dir}" mkdir -p "$svn_dir" if [ -d "$svn_dir" ]; then echo "svn目录创建成功" else echo "svn目录创建失败,程序终止" exit fi echo "请输入版本同步目录,如/www/wwwroot/project1/" read webdir if [ -d "$webdir" ]; then echo "${webdir}目录已存在,是否强制删除目录,是输入1,否则终止执行:" read delcc if [ "$delcc" -eq 1 ]; then echo "正在执行删除${webdir}目录..." rm -rf "$webdir" else echo "您已取消配置!" exit fi fi echo "正在创建目录:${webdir}" mkdir -p "$webdir" if [ -d "$webdir" ]; then echo "svn同步目录创建成功" else echo "svn同步目录创建失败,程序终止" exit fi echo -e "===============进入2.配置authz======\n" setauthz() { #用户组设置 echo "[groups]" >$tmp_file_authz echo -e "\n请输入用户组和用户,格式【组名=用户0,用户1,用户2】:" echo '按下 <CTRL-D> 退出' echo -n "请输入用户组,如:admin=user1,user2,请继续:" echo -e "\n" while read groups; do echo "${groups}" >>$tmp_file_authz echo "${groups} 已保存,请继续:" done echo -e "\n" >>$tmp_file_authz echo -e "\n\n\n接下来配置户组权限,rw-读写,w-只写,r-只读,@groupName设置某个用户组权限\n" echo -e "目录如[/],[/www/web1/dir1/dir22]\n" echo -e "例如(#后面是注释):\n" echo "-------example start-----------" echo -e "[/]#设置一个权路径\n" echo -e "@group1=rw#给group1用户组读写权限\n" echo -e "user1=r#给user1设置只读权限\n" echo -e "@admin=rw#给admin用户组读写权限\n" echo -e "[/www/wwwroot/web1/test]\n" echo -e "@test=rw\n" echo -e"------example end----------\n\n" echo '按下 <CTRL-D> 退出' echo -n "请输入权限配置,先目录后用户和权限:" echo -e "\n" while read auths; do echo "${auths}" >>$tmp_file_authz echo "${auths} 已保存,请继续:" done echo "正在保存您的配置,请稍后......" echo -e "============配置authz完成==============\n" } setpwd() { echo -e "===============进入3.定义账号密码===============\n" echo "[users]" >$tmp_file_passwd echo '按下 <CTRL-D> 退出' echo -n '请输入账户和密码,格式【用户名=密码】: ' echo -e "\n" while read users; do echo "$users" >>$tmp_file_passwd echo "${users} 已保存,请继续以下一个:" done echo -e "=============密码设置完成======================\n\n" } setsvnconf() { echo "=========4.定义svnserve权限(自动完成)=========" echo "=== " echo "=== 请按照提示操作输入 " echo "=== " echo "============================================" echo "[general]" >$tmp_file_serve echo "anon-access = none" >>$tmp_file_serve echo "auth-access = write" >>$tmp_file_serve echo "password-db = passwd" >>$tmp_file_serve echo "authz-db = authz" >>$tmp_file_serve echo -e "自动配置为:\n" cat $tmp_file_serve echo -e "\n" echo -e "=========svnserve权限已经自动完成=========\n" } sethook() { echo "=========5.接下来配置hook脚本=========" echo "============================================" echo "=== " echo "===这里存放提交后需要执行的脚本命令、提醒等操作======" echo "===同步svn版本到网站目录如: " echo "指令:svn update ${webdir} --username [用户名] --password [密码] " echo "===在如给目录设置权限(更新后将网站目录重新分配拥有者和权限,www:www比较安全,默认是root:root):" echo -e "指令:chown www:www /web/test -R \n" echo -e "============================================\n\n" echo "#!/bin/bash" >$tmp_file_hook echo "export LANG=\"zh_CN.UTF-8\"" >>$tmp_file_hook echo '按下 <CTRL-D> 退出' echo -e "下面的格式:【--username 用户名 --password 用户密码】,如'svn update /www/wwwroot/web1/ --username u1 --password 123456'\n" echo -n '请输入需要执行的shell脚本命令: ' echo -e "\n" while read cmds; do echo "${cmds}" >>"$tmp_file_hook" echo " $cmds 已保存" done echo -e "正在给post-commit文件设置执行权限755...\n" chmod 755 "$tmp_file_hook" echo -e "post-commit文件权限分配完成\n" echo -e "=========hook同步服务配置完成=========\n" } setport() { echo -e "==========6.监听端口配置===========\n" echo "请输入监听的端口号,如5551:" read port if [ $port ]; then echo "您的端口号是:${port}" echo "$port" >>$tmp_file_port else port=50001 echo "端口未设置,默认50001" fi echo -e "==========您的配置已经完成===========\n" } #开始配置 startconf() { echo -e "\n\n==========开始配置==========\n\n" echo -e "==============自动执行中=============\n" echo -e "==============正在创建目录${svn_dir}=====\n" svnadmin create "$svn_dir" if [ ! -d "$svn_dir" ]; then echo "创建${svn_dir}失败,已终止配置!" else echo -e "==============创建目录${svn_dir}=====√\n" fi cp $tmp_file_authz "${svn_dir}/conf/" echo -e "==============copy file ${tmp_file_authz}=====√\n" cp $tmp_file_passwd "${svn_dir}/conf/" echo -e "==============copy file ${tmp_file_passwd}=====√\n" cp $tmp_file_serve "${svn_dir}/conf/" echo -e "==============copy file ${tmp_file_serve}=====√\n" cp $tmp_file_hook "${svn_dir}/hooks/" echo -e "==============copy file ${tmp_file_hook}=====√\n" echo -e "==============文件配置完成,接下来配置监听=============\n" #svnserve -d -r /svn/test --listen-port 123456 #监听123456这个端口,需要提前从服务器放出i来 svnserve -d -r "${svn_dir}" --listen-port "${port}" echo -e "==============监听已启动,接下来检出一次测试=============\n" echo -e "请输入本服务器的IP地址:" read ipaddr if [ -z $ipaddr ]; then echo "请输入本服务器的IP地址:" read ipaddr if [ -z $ipaddr ]; then echo "非常感谢您的不配做,接下来的工作交给您自己操作了,再见" exit else echo -e "正在检出....\n" fi else echo -e "正在检出....\n" fi echo "svn checkout svn://${ipaddr}:${port} ${webdir} --username u1 --password userpwd" echo -e "还是要你自己来啊,最后检出一下哈,按照上面的格式检出到目标网站,祝您生活愉快\n" echo -e "如果需要开机自动启动,请自行添加监听到启动文件,如/etc/rc.local文件新增监听命令\n" echo -e "开启自动监听可以直接追加开启命令:echo svnserve -d -r ${svn_dir} --listen-port ${port} >> /etc/rc.local " } setauthz setpwd setsvnconf sethook setport startconf
执行过程:
查看svn目录的情况:
最后监听需要动执行
后期优化:一些权限的判断、监听端口的查询、日志记录等。