fastjson jar包替换脚本

fastjson jar包替换脚本

前段时间爆出fastjson低版本的安全漏洞,经过检查系统中有些模块使用了fastjson.在甲方的要求下需要尽快修复漏洞(升级到fastjson的高版本),时间紧(规定时间内完成修复),任务重(生产环境面临400多应用程序需要检查并修复).对比了几种修复办法,最后决定,使用jar包替换的方式来修复.(精确到应用程序,逐个替换,风险可控).

面临400多应用程序,临时写了个shell脚本来检查哪些应用程序需要替换,并且完成替换,生成一个新的jar包.再统一重启验证业务逻辑.

实现思路

1.通过shell,扫描每个应用程序文件夹下的程序
2.复制当前jar包到备份文件件
3.解压jar包.查看解压包中是否有需要替换的fastjson
4.如果不存在需要替换的jar包.删除备份文件夹,跳过.
5.如果存在需要替换的jar包.把高版本的jar包替换低版本的jra包.并且重新打包.
6.最后输出日志记录,记录出哪些应用程序已经替换了jar包.
7.运维根据输出的日志,批量重启服务.

核心代码

#!/usr/bin/env bash
#替换生产环境的fastjson.
# 1.找到当前文件夹下的jar包.
# 2.把jar包复制到备份的文件夹.
# 3.在备份的文件夹中,用jar命令解压缩包
# 4.在解压缩的lib包下,查找fastjson.
# 5.判断fastjson版本.是否需要替换
# 6.如果需要替换.直接进行替换,生成新的程序包.放到备份目录里,并且把之前解压缩的文件删除.
# 7.如果不需要替换.直接删除备份文件夹
# 8.输出需要替换的程序包的日志

CURRENT_DIR='/data/app/'
filename='xxx.xxx.xxx.xxx_20220614_fastjson'
cd $CURRENT_DIR

dirs=$(ls -d */)
#echo $dirs

for dir in $dirs
do
    cd ${CURRENT_DIR}${dir}
    jarName=$(ls *.jar)
    echo "jarName=$jarName"
    if [ -z "$jarName" ]; then
     echo "没有找到需要处理的jar包."
     continue
    fi

    size=${#jarName[@]}
    if [ $size -ge 2 ]; then
        echo "程序执行出现异常 -- 文件夹=${CURRENT_DIR}${dir},里面jar包不止一个"
        echo "$(date "+%Y-%m-%d %H:%M:%S") --error-- 文件夹=${CURRENT_DIR}${dir},里面jar包不止一个" >> $CURRENT_DIR$filename.txt
        continue
    fi

    #创建一个备份文件夹
    if [ -d "${CURRENT_DIR}${dir}fastjson-bak" ];then
        rm -rf ${CURRENT_DIR}${dir}fastjson-bak
    fi

    echo "1.创建一个备份文件夹,${CURRENT_DIR}${dir}fastjson-bak"
    mkdir -p ${CURRENT_DIR}${dir}fastjson-bak

    #把jar包复制到备份文件夹中
    echo "2.把jar包复制到备份文件夹中,cp ${CURRENT_DIR}${dir}$jarName  ${CURRENT_DIR}${dir}fastjson-bak"
    cp -a ${CURRENT_DIR}${dir}$jarName  ${CURRENT_DIR}${dir}fastjson-bak
    cd ${CURRENT_DIR}${dir}fastjson-bak

    #解压缩jar
    echo "3.解压缩jar,jar -xf ${CURRENT_DIR}${dir}fastjson-bak/${jarName}"
    /opt/soft/jdk18/bin/jar -xf ${CURRENT_DIR}${dir}fastjson-bak/${jarName}
    cd ${CURRENT_DIR}${dir}fastjson-bak/BOOT-INF/lib
    #whereami=$(pwd)
    #echo "当前目录=$whereami"

    echo "4.查询需要替换的fastjson,ls fastjson*.jar"
    fastJsonJarName=$(ls fastjson*.jar)
#    echo "ls返回值=$fastJsonJarName"

    if [ ! -n "$fastJsonJarName" ]; then
        echo "文件夹=${CURRENT_DIR}${dir}fastjson-bak/BOOT-INF/lib,里面没有找到fastjson.jar包"
        echo "$(date "+%Y-%m-%d %H:%M:%S") -- 文件夹=${CURRENT_DIR}${dir}fastjson-bak/BOOT-INF/lib,里面没有找到fastjson.jar包" >> $CURRENT_DIR$filename.txt
        cd $CURRENT_DIR
        #echo "没有找到需要替换的fastjson包,删除备份文件夹;rm -rf ${CURRENT_DIR}${dir}fastjson-bak"
        rm -rf ${CURRENT_DIR}${dir}fastjson-bak
        continue
    fi

    fastjsonsize=${#fastJsonJarName[@]}
    # 大于
    if [ $fastjsonsize -ge 2 ]; then
        echo "文件夹=${CURRENT_DIR}${dir}fastjson-bak/BOOT-INF/lib,里面fastjson.jar包不止一个"
        #写入日志
        echo "$(date "+%Y-%m-%d %H:%M:%S") --error-- 文件夹=${CURRENT_DIR}${dir}fastjson-bak/BOOT-INF/lib,里面fastjson.jar包不止一个" >> $CURRENT_DIR$filename.txt
        continue
    fi

    replace_flag=fasle
    #判断fastjson是否需要替换
	str2=fastjson-1.2.83.jar
	echo "5.准备替换fastjson,需要替换的fastjson=$fastJsonJarName"
	if [ "$fastJsonJarName" \< "$str2" ];
	then
	    replace_flag=true
	    echo "6.准备删除老版本fastjson包,rm -rf $fastJsonJarName"
        rm -rf $fastJsonJarName
        #复制新的fastjson包
        cp $CURRENT_DIR/fastjson-1.2.83.jar .
        cd ${CURRENT_DIR}${dir}fastjson-bak
        #重新打包
        echo "7.替换成功,准备重新打包"
        /opt/soft/jdk18/bin/jar -cfM0 new_${jarName} BOOT-INF META-INF org
        #删除文件夹
        rm -rf BOOT-INF META-INF org

        echo "8.打包成功,记录日志.日志路径=$CURRENT_DIR$filename.txt"
        echo "$(date "+%Y-%m-%d %H:%M:%S") -- 文件夹=${CURRENT_DIR}${dir}$jarName,发现fastjson不符合要求,不符合的jar包=${CURRENT_DIR}${dir}fastjson-bak/BOOT-INF/lib/$fastJsonJarName \
需要替换.生成的新包地址=${CURRENT_DIR}${dir}fastjson-bak/new_${jarName}" >> $CURRENT_DIR$filename.txt
    fi

    echo "是否完成替换=$replace_flag"
     if [ "$replace_flag" == "fasle" ]; then
     #没有需要替换的.直接删除文件夹
        cd $CURRENT_DIR
        echo "没有找到需要替换的fastjson包,删除备份文件夹;rm -rf ${CURRENT_DIR}${dir}fastjson-bak"
        rm -rf ${CURRENT_DIR}${dir}fastjson-bak
     fi
done
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以在以下链接下载fastjson jar包: - 1.2.57版本:[https://www.aliyundrive.com/s/g2yWiQAMoVj](https://www.aliyundrive.com/s/g2yWiQAMoVj) - 1.2.56版本:[https://www.aliyundrive.com/s/R9i4eXGzLJF1.2.56.sec06](https://www.aliyundrive.com/s/R9i4eXGzLJF1.2.56.sec06) - 1.2.55版本:[https://www.aliyundrive.com/s/xkSddqY7ScL1.2.56](https://www.aliyundrive.com/s/xkSddqY7ScL1.2.56) - 1.2.54版本:[https://www.aliyundrive.com/s/Jfb2xnDCR8L1.2.55.sec10](https://www.aliyundrive.com/s/Jfb2xnDCR8L1.2.55.sec10) - 1.2.53版本:[https://www.aliyundrive.com/s/WuJecBP9tYB1.2.55](https://www.aliyundrive.com/s/WuJecBP9tYB1.2.55) - 1.2.52版本:[https://www.aliyundrive.com/s/kY4f2Ni9xCS1.2.54.sec10](https://www.aliyundrive.com/s/kY4f2Ni9xCS1.2.54.sec10) - 1.2.31版本:[https://www.aliyundrive.com/s/hMXMXctUkcX1.2.53](https://www.aliyundrive.com/s/hMXMXctUkcX1.2.53) - 1.2.30版本:[https://www.aliyundrive.com/s/jXD8EsqEEK51.2.52.sec10](https://www.aliyundrive.com/s/jXD8EsqEEK51.2.52.sec10) - 1.2.29版本:[https://www.aliyundrive.com/s/hesouUy1oVR1.2.31](https://www.aliyundrive.com/s/hesouUy1oVR1.2.31)<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Alibaba Fastjson Jar包](https://download.csdn.net/download/sulei_haomin/10651516)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Fastjson jar包下载地址](https://blog.csdn.net/qq_43672126/article/details/111183426)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值