写个shell脚本配置svn,自动化达到95%

花了将近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


执行过程:

微信截图_20210708101851.png


查看svn目录的情况:

微信截图_20210708102147.png


最后监听需要动执行


后期优化:一些权限的判断、监听端口的查询、日志记录等。


评论/留言