配置文件智能的备份和还原_PHP教程

php中文网
发布: 2016-07-12 08:57:32
原创
1108人浏览过

极简智能王
极简智能王

极简智能- 智能聊天AI绘画,还可以创作、编写、翻译、写代码等多种功能,满足用户生活和工作的多方面需求

极简智能王 33
查看详情 极简智能王

配置文件智能的备份和还原

运用场景:
每当我们为很多安装同样的机器升级或者更新服务时,要备份配置文件中的某一行或者多行,或者一个数据块或者多个数据块,和服务升级、更新完后,再把对应的备份数据重新写回新的配置文件中;在大批量的服务器中操作,会浪费很多的时间和精力,以下脚本就是用来完成类似的事情。
主要功能有:
1.备份指定的一行或者多行,一个块或者多个块
2.备份指定的单个文件
3.还原所有部分备份和所有备份
4.配置文件精确定位插入【正则匹配】
5.配置文件精确定位删除
6.配置文件类似行后批量插入
服务的配置文件样例:
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>server.config:<br /> </li><li>####配置文件样例:<br /></li><li>ser_max_connection=6000  #行<br /></li><li>ser_min_connection=10<br /></li><li><br /></li><li>ser_time_out=60<br /></li><li>ser_time_spent=120<br /></li><li><br /></li><li>server tcp_nodes{       ##块<br /></li><li><br /></li><li>ser_client_ip=ipv4<br /></li><li>ser_client_len=20*n<br /></li><li>ser_client_syn=yes<br /></li><li>ser_client_ack=yes<br /></li><li>}</li></ol>
登录后复制
以下是shell脚本的代码实现,脚本主要是利用sed工具来完成配置编辑功能。此脚本是根据真实应用环境中改成通用版本,并没有经过严格的测试,如果你想要用此脚本,还请根据自己的环境下,做严重的测试。如果你有更好的想法,请加入qq群:63565867。

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>#!/bin/bash<br /> </li><li>#diandian<br /></li><li>proconf=/usr/local/server/etc         #要备份的主目录,参数传入的文件名和会这个路径合并起来<br /></li><li>confpath=$proconf<br /></li><li>bkpath=/usr/local/src/bkconfig/part   #备份文件中部分内容的保存目录<br /></li><li>bkpath_whole=/usr/local/src/bkconfig/whole  #备份整个文件的保存目录<br /></li><li>handle_date=$(date "+%y%m%d%h%m")<br /></li><li>mkdir -p $bkpath $bkpath_whole<br /></li><li>fj='^+'<br /></li><li>fd='^='<br /></li><li>allfile=""<br /></li><li><br /></li><li>function multidir(){ #dirname  ##shell里面的一个递归函数,用来获得一个目录下的所有文件【如果文件名中包括空格,可能会出错】<br /></li><li><br /></li><li>local dirs=$1<br /></li><li>local diri=0<br /></li><li>if [ ! -d $dirs ];then<br /></li><li>echo "$dirs is not a directory."<br /></li><li>exit 1<br /></li><li>fi<br /></li><li>local lsfile=$(ls -d $dirs/* 2>/dev/null)<br /></li><li>local dir_list=($lsfile)<br /></li><li>for((diri=0;diri<${#dir_list[@]};diri++)){<br /></li><li>if [ -d ${dir_list[$diri]} ];then<br /></li><li>multidir ${dir_list[$diri]}<br /></li><li>else<br /></li><li>allfile="$allfile ${dir_list[$diri]}"<br /></li><li>fi<br /></li><li>}<br /></li><li>}<br /></li><li><br /></li><li>if [ "x$1" == "xbackup" ];then<br /></li><li>num=0<br /></li><li>if [ "x$2" != "x" ];then<br /></li><li>old_ifs="$ifs"<br /></li><li>ifs="#"<br /></li><li>field=($2)<br /></li><li>ifs="$old_ifs"<br /></li><li>else<br /></li><li>echo -e " error "<br /></li><li>exit 1<br /></li><li>fi<br /></li><li>sfs="+"<br /></li><li>f_conf="$confpath/${field[0]}"<br /></li><li>b_conf="$bkpath/${field[0]}"<br /></li><li>b_cdir=$(dirname $b_conf)<br /></li><li>if [ -e "$b_conf" -a -s "$b_conf" ];then<br /></li><li>echo -e " error $b_conf exist and no empty. "<br /></li><li>exit 1<br /></li><li>fi<br /></li><li>if [ ! -d $b_cdir ];then<br /></li><li>mkdir -p $b_cdir<br /></li><li>fi<br /></li><li>if [ -f "$f_conf" ];then<br /></li><li>echo "backup @${field[0]}"<br /></li><li>while read line<br /></li><li>do<br /></li><li>((num++))<br /></li><li>for((i=1;i<${#field[@]};i++)){<br /></li><li>if [[ ${field[$i]} =~ $fj ]];then<br /></li><li>st=${field[$i]#+}<br /></li><li>if [[ $line =~ ^$st ]];then<br /></li><li>sed -n "$num,/}/p" $f_conf | sed '1s/^/&+/' >> $b_conf<br /></li><li>fi<br /></li><li>elif [[ ${field[$i]} =~ $fd ]];then<br /></li><li>st=${field[$i]#=}<br /></li><li>stline=${line%%=*}<br /></li><li>if [[ "$stline" == "$st" ]];then<br /></li><li>sed -n "${num}p" $f_conf | sed '1s/^/&=/' >> $b_conf<br /></li><li>fi<br /></li><li>else<br /></li><li>if [[ $line =~ ^${field[$i]} ]];then<br /></li><li>sed -n "${num}p" $f_conf | sed '1s/^/&-/' >> $b_conf<br /></li><li>fi<br /></li><li>fi<br /></li><li>}<br /></li><li>done < $f_conf<br /></li><li>else<br /></li><li>echo -e " error:skip ${field[0]} "<br /></li><li>fi<br /></li><li>elif [ "x$1" == "xrestore" ];then<br /></li><li>if [ "x$2" != "x" ];then<br /></li><li>list=(`ls -f $bkpath/$2 2>/dev/null`)<br /></li><li>else<br /></li><li>#list=(`ls -d $bkpath/* 2>/dev/null`)<br /></li><li>multidir $bkpath<br /></li><li>list=($allfile)<br /></li><li>fi<br /></li><li>if [ "$list" == "" ];then<br /></li><li>echo -e " restore:no valid file. "<br /></li><li>fi<br /></li><li>for i in ${list[*]}<br /></li><li>do<br /></li><li>num=0<br /></li><li>b_conf="$i"<br /></li><li>base=$(basename $i)<br /></li><li>if [ "$base" == "" -a -s $b_conf ];then<br /></li><li>echo -e " restore error @ $b_conf "<br /></li><li>continue<br /></li><li>fi<br /></li><li>f_conf=$(echo $i | sed -n "s#$bkpath#$confpath#p")<br /></li><li>#f_conf="$confpath/$base"<br /></li><li>echo -n "@ $f_conf "<br /></li><li>if [ ! -f $f_conf ];then<br /></li><li>echo -e " restore error @ $f_conf "<br /></li><li>continue<br /></li><li>fi<br /></li><li>while read bconf<br /></li><li>do<br /></li><li>((num++))<br /></li><li>tt=""<br /></li><li>str=""<br /></li><li>if [[ $bconf =~ $fj ]];then<br /></li><li>str=$(sed -n -e "${num},/}/p" $b_conf | sed '1s/^+//' | awk '{s=s"\n"$0;}end{sub(/^../,"",s);printf("%s",s);}')<br /></li><li>tt="+"<br /></li><li>elif [[ $bconf =~ $fd ]];then<br /></li><li>str=$(sed -n -e "${num}p" $b_conf | sed '1s/^=//' | awk '{s=s"\n"$0;}end{sub(/^../,"",s);printf("%s",s);}')<br /></li><li>tt="="<br /></li><li>elif [[ $bconf =~ ^- ]];then<br /></li><li>str=$(sed -n -e "${num}p" $b_conf | sed '1s/^-//' | awk '{s=s"\n"$0;}end{sub(/^../,"",s);printf("%s",s);}')<br /></li><li>tt="-"<br /></li><li>else<br /></li><li>continue<br /></li><li>fi<br /></li><li>first=$(echo -e $str | sed -n 1p)<br /></li><li>seek=0<br /></li><li>while read fconf<br /></li><li>do<br /></li><li>((seek++))<br /></li><li>tmp_fconf=${fconf%%=*}<br /></li><li>tmp_first=${first%%=*}<br /></li><li>if [ "$tmp_fconf" == "$tmp_first" ];then<br /></li><li>if [ "$tt" == "+" ];then<br /></li><li>sed -i "${seek},/}/d" $f_conf<br /></li><li>if [ $seek -ne 1 ];then<br /></li><li>sed -i "$[ ${seek} - 1 ]a$str" $f_conf<br /></li><li>else<br /></li><li>sed -i "${seek}a$str" $f_conf<br /></li><li>fi<br /></li><li>echo -n "$tt"<br /></li><li>tt=""<br /></li><li>break<br /></li><li>elif [ "$tt" == "=" ];then<br /></li><li>sed -i "${seek}s/.*/$str/" $f_conf<br /></li><li>echo -n "$tt"<br /></li><li>tt=""<br /></li><li>break<br /></li><li>elif [ "$tt" == "-" ];then<br /></li><li>sed -i "${seek}s/.*/$str/" $f_conf<br /></li><li>echo -n "$tt"<br /></li><li>tt=""<br /></li><li>break<br /></li><li>fi<br /></li><li>fi<br /></li><li>done < $f_conf<br /></li><li>if [ "$tt" != "" ];then<br /></li><li>err=$err" $first
"<br /></li><li>fi<br /></li><li>done < $b_conf<br /></li><li>echo<br /></li><li>done<br /></li><li>if [ "$err" != "" ];then<br /></li><li>echo -e "
error: $err"<br /></li><li>err=""<br /></li><li>fi<br /></li><li>elif [ "x$1" == "xinsert" ];then<br /></li><li>num=0<br /></li><li>snum=0<br /></li><li>n=1<br /></li><li>nn=0<br /></li><li>old_ifs="$ifs"<br /></li><li>ifs="#"<br /></li><li>if [ "x$2" != "x" ];then<br /></li><li>insert=($2)<br /></li><li>else<br /></li><li>echo -e " insert error "<br /></li><li>exit 1<br /></li><li>fi<br /></li><li>ifs="$old_ifs"<br /></li><li>if [ -f "$confpath/${insert[0]}" ];then<br /></li><li>while read olc<br /></li><li>do<br /></li><li>((num++))<br /></li><li>tmp_olc=$(echo "$olc" | sed 's/ //g')<br /></li><li>tmp_olc=${tmp_olc%%=*}<br /></li><li>tmp_insert=$(echo "${insert[$n]}" | sed 's/ //g')<br /></li><li>tmp_insert=${tmp_insert%%=*}<br /></li><li>if [[ "$tmp_olc" == $tmp_insert && $n -le ${#insert[@]} ]];then<br /></li><li>((n++))<br /></li><li>if [ $n -eq $[ ${#insert[@]} - 1 ] ];then<br /></li><li>echo "insert: ${insert[$n]} @ ${insert[0]}[$num]"<br /></li><li>snum=$num<br /></li><li>nn=$n<br /></li><li>elif [ $n -eq ${#insert[@]} ];then<br /></li><li>echo -e "${insert[$nn]} exits."<br /></li><li>exit 1<br /></li><li>fi<br /></li><li>else<br /></li><li>if [[ $num -eq $[ $snum + 2 ] && $nn -eq $n ]];then<br /></li><li>break<br /></li><li>fi<br /></li><li>fi<br /></li><li>done < $confpath/${insert[0]}<br /></li><li>if [ $nn -ne $[ ${#insert[@]} - 1 ] ];then<br /></li><li>echo -e " insert error: none ${insert[$nn]}  $[ $nn + 1 ]"<br /></li><li>exit 1<br /></li><li>fi<br /></li><li>str="${insert[$nn]}"<br /></li><li>sed -i "${snum}a\$str" $confpath/${insert[0]}<br /></li><li>else<br /></li><li>echo -e " insert error:file not exist $confpath/${insert[0]} "<br /></li><li>fi<br /></li><li>elif [ "x$1" == "xdelete" ];then<br /></li><li>num=0<br /></li><li>n=1<br /></li><li>del=0<br /></li><li>old_ifs="$ifs"<br /></li><li>ifs="#"<br /></li><li>if [ "x$2" != "x" ];then<br /></li><li>delete=($2)<br /></li><li>else<br /></li><li>echo -e " delete error "<br /></li><li>exit 1<br /></li><li>fi<br /></li><li>ifs="$old_ifs"<br /></li><li>if [ -f "$confpath/${delete[0]}" ];then<br /></li><li>while read olc<br /></li><li>do<br /></li><li>((num++))<br /></li><li>tmp_olc=$(echo "$olc" | sed 's/ //g')<br /></li><li>tmp_olc=${tmp_olc%%=*}<br /></li><li>tmp_delete=$(echo "${delete[$n]}" | sed 's/ //g')<br /></li><li>tmp_delete=${tmp_delete%%=*}<br /></li><li>#echo "$tmp_olc"<br /></li><li>if [[ $tmp_olc == $tmp_delete ]];then<br /></li><li>((n++))<br /></li><li>if [ $n -eq $[ ${#delete[@]} ] ];then<br /></li><li>echo "delete: ${delete[$n-1]} @ ${delete[0]}[$num]"<br /></li><li>del=1<br /></li><li>break<br /></li><li>fi<br /></li><li>fi<br /></li><li>done < $confpath/${delete[0]}<br /></li><li>if [ $n -ne $[ ${#delete[@]} ] ];then<br /></li><li>echo -e "can't find:"${delete[$n]}"@ $[ $n + 1 ] "<br /></li><li>exit 1<br /></li><li>fi<br /></li><li>sed -i "${num}d" $confpath/${delete[0]}<br /></li><li>else<br /></li><li>echo -e " delete error:file not exist $confpath/${delete[0]} "<br /></li><li>fi<br /></li><li>elif [ "x$1" == "xinsall" ];then<br /></li><li>old_ifs="$ifs"<br /></li><li>ifs="#"<br /></li><li>if [ "x$2" != "x" ];then<br /></li><li>insert=($2)<br /></li><li>else<br /></li><li>echo -e " insall error "<br /></li><li>exit 1<br /></li><li>fi<br /></li><li>ifs="$old_ifs"<br /></li><li>if [ -f "$confpath/${insert[0]}" ];then<br /></li><li>sed -i "/${insert[1]}/a\${insert[2]}" $confpath/${insert[0]}<br /></li><li>fi<br /></li><li>elif [ "x$1" == "xcopy" ];then<br /></li><li>if [ "x$2" != "x" ];then<br /></li><li>old_ifs="$ifs"<br /></li><li>ifs="#"<br /></li><li>field=($2)<br /></li><li>ifs="$old_ifs"<br /></li><li>else<br /></li><li>echo -e " copy error "<br /></li><li>exit 1<br /></li><li>fi<br /></li><li>for((i=0;i<${#field[@]};i++)){<br /></li><li>deep=$(dirname ${field[$i]} 2>/dev/null)<br /></li><li>copied_dir=$confpath/$deep<br /></li><li>copied_file=$confpath/${field[$i]}<br /></li><li>bk_dir=$bkpath_whole/$deep<br /></li><li>bk_file=$bkpath_whole/${field[$i]}<br /></li><li>if [ ! -d "$copied_dir" -o ! -f "$copied_file" ];then<br /></li><li>echo -e " copy error @ ${field[$i]}"<br /></li><li>exit 1<br /></li><li>fi<br /></li><li>if [ -e "$bk_file" -a -s "$bk_file" ];then<br /></li><li>echo -e " error $bk_file exist and no empty. "<br /></li><li>exit 1<br /></li><li>fi<br /></li><li>mkdir -p $bkpath_whole/$deep && /bin/cp -f $copied_file $bk_file <br /></li><li>check=$(diff $bk_file $copied_file)<br /></li><li>if [ "$check" == "" ];then<br /></li><li>echo "copy $copied_file => $bk_file"<br /></li><li>else<br /></li><li>echo "error copy @ ${field[$i]}"<br /></li><li>fi<br /></li><li>}<br /></li><li>elif [ "x$1" == "xrcopy" ];then<br /></li><li>if [ "x$2" != "x" ];then<br /></li><li>old_ifs="$ifs"<br /></li><li>ifs="#"<br /></li><li>field=($2)<br /></li><li>ifs="$old_ifs"<br /></li><li>else<br /></li><li>echo -e " rcopy error "<br /></li><li>exit 1<br /></li><li>fi<br /></li><li>for((i=0;i<${#field[@]};i++)){<br /></li><li>if [ "${field[$i]}" == "" ];then<br /></li><li>continue<br /></li><li>fi<br /></li><li>deep=$(dirname ${field[$i]} >/dev/null)<br /></li><li>rcopied_dir=$confpath/$deep<br /></li><li>rcopied_file=$confpath/${field[$i]}<br /></li><li>bk_dir=$bkpath_whole/$deep<br /></li><li>bk_file=$bkpath_whole/${field[$i]}<br /></li><li>if [ ! -d "$bk_dir" -o ! -f "$bk_file" ];then<br /></li><li>echo -e " rcopy error $bk_dir not dir or $bk_file not file."<br /></li><li>exit 1<br /></li><li>fi<br /></li><li>if [ ! -s "$bk_file" ];then<br /></li><li>echo -e " rcopy error $bk_file exist but empty. "<br /></li><li>exit 1<br /></li><li>fi<br /></li><li>if [ ! -d "$rcopied_dir" ];then<br /></li><li>echo -e " rcopy error:$rcopied_dir not dir. "<br /></li><li>exit 1<br /></li><li>fi<br /></li><li>/bin/cp -f $rcopied_file $rcopied_file.$handle_date || ( echo -e "rcopy: backup $rcopied_file failed." && exit 1)<br /></li><li>/bin/cp -f $bk_file $rcopied_file || ( echo -e "rcopy: rcopy: restore $rcopied_file failed." && rm -rf $rcopied_file.$handle_date && exit 1)<br /></li><li>check=$(diff $bk_file $rcopied_file)<br /></li><li>if [ "$check" == "" ];then<br /></li><li>echo "restore $bk_file => $rcopied_file"<br /></li><li>rm -rf $rcopied_file.$handle_date<br /></li><li>else<br /></li><li>echo "error rcopy @ ${field[$i]}"<br /></li><li>/bin/cp -f $rcopied_file.$handle_date $rcopied_file<br /></li><li>rm -rf $rcopied_file.$handle_date<br /></li><li>fi<br /></li><li>}<br /></li><li>elif [ "x$1" == "xversion" ];then<br /></li><li>echo "version:1.0.7"<br /></li><li>else <br /></li><li>echo -e "批量备份还原给定目录下的配置文件,可以备份某个文件中的一行或者多行、一个块或者多个块。恢复时,可以直接找到对应的行或者块还原。"<br /></li><li>echo -e "插入字段时,可能精确到具体的某一行"<br /></li><li>echo -e "要被备份的文件格式有两种:"<br /></li><li>echo -e "如:"<br /></li><li>echo -e "pattern_hot_switch=0         #行"<br /></li><li>echo -e "define server_proxy_host1{   #块,块以}作为结束符号"<br /></li><li>echo -e "    part1=no1"<br /></li><li>echo -e "    part2=no2"<br /></li><li>echo -e "    part3=no3"<br /></li><li>echo -e "}"<br /></li><li>echo -e "help:"<br /></li><li>echo -e "backup dir:"<br /></li><li>echo -e "	server conf dir: $confpath"<br /></li><li>echo -e "	partbkp conf dir: $bkpath"<br /></li><li>echo -e "	wholebkp conf dir: $bkpath_whole"<br /></li><li>echo "usage: $0 [backup|restore|insert|delete|insall|copy|rcopy|version]"<br /></li><li>echo "backup:备份  restore:还原   insert:插入  delete:删除  insall:批量插入  copy:拷贝文件   rcopy:还原拷贝的文件"<br /></li><li>echo -e "	backup 'server.config#+srcpattern#=request_src_type#...#+src src_acl#'"<br /></li><li>echo -e "	backup 'main.config#p_src_switch#url_log_switch#=url_log_switch#'"<br /></li><li>echo -e "	restore"<br /></li><li>echo -e "	restore main.config"<br /></li><li>echo -e "	insert 'server.config#def p_r t_default#...#r_ww_switch#  xxx_xxx_xxx=1-2-3-'"<br /></li><li>echo -e "	delete 'server.config#def p_r t_default#...#r_ww_switch#xxx_xxx_xxx'"<br /></li><li>echo -e "	insall 'server.config#def p_r t_default#xxx_xxx_xxx=1-2-3-'"<br /></li><li>echo -e "	copy 'main.config#r.config#....'"<br /></li><li>echo -e "	rcopy 'main.config#r.config#....'"<br /></li><li>fi</li><li><br /></li></ol>
登录后复制

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1108028.htmlTechArticle配置文件智能的备份和还原 运用场景: 每当我们为很多安装同样的机器升级或者更新服务时,要备份配置文件中的某一行或者多行,或者...
相关标签:
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号