fastjson版本替换升级脚本

fastjson漏洞修复脚本
  • 脚本说明
    fastjson_update.sh:对指定目录下的fastjson jar包进行备份、升级、还原。

  • 使用帮助

    • 上传到项目外任意目录下并解压并赋予执行权限(如/opt)

      cd /opt
      tar xf fastjson_update.tar.gz
      chmod +x fastjson_update/fastjson_update.sh
      
    • 查看脚本帮助信息

      cd /opt/fastjson_update
      ./fastjson_update.sh h 
      或
      ./fastjson_update.sh help
      fastjson相关依赖包备份、还原、升级脚本使用说明:
      Usage: fastjson_update.sh <option>
      option 支持以下参数
        backup|b   备份
        restore|r  还原备份
        update|u  还原备份
        help|h  显示帮助信息
      
    • 原有fastjson环境备份

      ./fastjson_update.sh backup
      #按照提示输入项目所在路径,如/data/topisa
      #备份完成后会提示完成信息;并在当前目录下存放备份的文件目录jar_backup和文件原始位置信息backup_info用于后续环境恢复
      

      image-20220524191229588

    • 版本升级

      ./fastjson_update.sh update
      #按照提示输入项目所在路径,如/data/topisa
      #升级完成后可手动使用find /data/topisa -name fastjson*.jar 查看升级是否正常
      #请手动重启相关服务
      

      image-20220524191411109

    • 版本回退

      ./fastjson_update.sh restore
      #使用备份的环境信息和原有fastjson依赖包进行环境恢复
      #恢复后请手动重启相关服务
      

      image-20220524191905637

  • 目录结构

    - fastjson_update
      - fastjson_update.sh
      - fastjson-1.2.83.jar
    
  • 脚本内容如下

    #!/bin/bash
    #fastjson 依赖包备份及还原脚本
    
    base_dir=$(cd `dirname $0`;pwd)
    base_name=${0##*/}
    backup_dir=${base_dir}/jar_backup
    backup_info=${base_dir}/backup_info
    des_path=/data
    
    if [[ ! -d ${backup_dir} ]] ;then
        mkdir ${backup_dir}
    fi
    
    help_info(){
        echo -e "fastjson相关依赖包备份、还原、升级脚本使用说明:"
        echo -e "Usage: ${base_name} <option>"
        echo -e "option 支持以下参数"
        echo -e "  backup|b   备份"
        echo -e "  restore|r  还原备份"
        echo -e "  update|u  还原备份"
        echo -e "  help|h  显示帮助信息"
    }
    backup(){
        echo "开始备份"
        while [ 1 ]; do
            echo  "请输入项目所在路径:" 
            read des_path
            if [[ ! -d ${des_path} ]] ;then
                echo "项目路径不存在,请重新输入;Ctrl+C退出"
            else
                break
            fi
        done 
        echo "3秒后开始执行fastjson备份;目标路径${des_path};如有异常Ctrl+C结束备份任务"
        sleep 3
        find ${des_path} -name "fastjson*.jar" | grep "${des_path}" > ${backup_info}
        sed  -i "s#^des_path=.*#des_path=${des_path}#" ${base_dir}/${base_name}
        echo "清空备份目录"
        rm -rf ${backup_dir}/*
        echo "=============================================================================================="
        for i in `cat ${backup_info}` 
        do 
            echo  -e "\t开始备份$i"
            echo y | cp -rf $i ${backup_dir}
        done
        echo "=============================================================================================="
        echo "备份已完成;请勿删除${backup_dir},${backup_info}"
         
    }
    
    restore(){
        if [[ ! -d ${des_path} ]] ;then
            echo "项目路径不存在,异常退出"
            exit 2
        fi
        echo "3s开始还原${des_path}路径下fastjson备份;如有异常Ctrl+C结束还原任务"
        sleep 3
        echo "清理新版本fastjson"
        count=`find ${des_path} -name fastjson-1.2.83.jar |wc -l`
        if [[ "${count}" != "0" ]];then
            find ${des_path} -name fastjson-1.2.83.jar  | xargs rm
        fi
    
        echo "恢复旧版本fastjson"
        echo "=============================================================================================="
        for i in `cat ${backup_info}` 
        do 
            jar_path=${i%/*}
            jar_name=${i##*/}
            echo -e "\t还原路径:$jar_path 下的 ${jar_name}"
            if [[ -d "${jar_path}" ]];then
                echo y | cp -rf ${backup_dir}/${jar_name} ${jar_path}
            fi 
        done
        echo "=============================================================================================="
        echo "还原结束"
    }
    update(){
        # fastjson version update to fastjson-1.2.83
        while [ 1 ]; do
            echo  "请输入项目所在路径:" 
            read des_path
            if [[ ! -d ${des_path} ]] ;then
                echo "项目路径不存在,请重新输入;Ctrl+C退出"
            else
                break
            fi
        done
        echo ${backup_info}
        if [[ ! -s ${backup_info}  ]] ;then
            while :
            do
                    read -p "项目fastjson未备份是否继续(y/n)"
                            case $REPLY in
                            Y|y)
                                    echo "继续进行fastjson版本升级"
                                    break ;;
                            n|N)
                                    echo "安装将1秒后自动结束;请使用$0 backup备份"
                                    sleep 1
                                    exit
                                    break ;;
                            *)
                                    echo "输入内容错误,请重新输入(输入y继续升级,输入n取消升级)"
                                    continue
                            esac
    
            done
        fi
        echo "开始替换"
        if [[ ! -d "${des_path}" ]] ;then
           echo "${des_path} 路径不存在,请重新输入"
           exit 2
        fi
        
        cd ${des_path}
        counts=`find ./ -name fastjson*.jar | grep -v fastjson-1.2.83.jar |wc -l`
        if [[ ${counts} != 0  ]] ;then
            find ./ -name fastjson*.jar | xargs dirname |xargs -i  cp ${base_dir}/fastjson-1.2.83.jar {}
            counts=`find ./ -name fastjson*.jar | grep -v fastjson-1.2.83.jar |wc -l`
            if [[ ${counts} != 0 ]];then
               find ./ -name fastjson*.jar | grep -v fastjson-1.2.83.jar  | xargs rm 
            fi
        else
            echo "当前环境不存在可升级的fastjson依赖"   
        fi
        echo "升级完成;请手动重启相关服务!!"   
    }
    
    if [[ $# -eq 1 ]];then
        option=$1
    else
        help_info
        exit 1
    fi
    
    case ${option} in
    "backup" | "b")
        backup
        exit 0
        ;;
    "restore"|"r")
        restore
        exit 0
        ;;
    "update"|"u")
        update
        exit 0
        ;;
    "h"|"help")
        help_info
        exit 0
        ;;
    *)
        echo "输入错误;使用帮助:$0 <backup b|restore r|help h>"
        ;;
    esac
    
    
posted @ 2022-09-01 10:54  MirL  阅读(690)  评论(0编辑  收藏  举报