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