背景:通过安全扫描发现有很多文件和目录的权限不符合要求,而且把不符合要求的文件和目录统一放到一个文件中。现在要根据文件中的内容去更改对应文件和目录的权限

#!/bin/bash
# vim:et:ts=4:sw=4:
#DATE:2021-08-29
#DESCRIBE:修改文件和目录权限,操作日志存放到file_permission.log
#MODIFY:

[ "$#" -ne 1 ] && echo "eg: bash file_permission.sh /root/scan_file.txt" && exit 1
FILE_PATH=$1 #安全扫描结果文件路径
[ ! -f ${FILE_PATH} ] && echo "error: ${FILE_PATH}不存在" && exit 1
[ ! -f ${FILE_PATH}.bak ] && cp ${FILE_PATH} ${FILE_PATH}.bak
dos2unix ${FILE_PATH}

WORKDIR=$(cd `dirname $0`;pwd) #脚本所在路径
[ -f ${WORKDIR}/file_permission.log ] && > ${WORKDIR}/file_permission.log #存放操作日志
[ -f ${WORKDIR}/parent_dir.txt ] && > ${WORKDIR}/parent_dir.txt

SUFFIX_NAME=(h sh py jar log) #查找的文件后缀名,省略了“.”符号,grep时会加上

#修改权限
Modify_Permission()
{
local suffix_name=$1 #文件后缀
local file_permission=$2 #文件权限
local dir_permission=$3 #目录权限
local file_name=$(cat ${FILE_PATH} |grep "^-.*\.${suffix_name}$" |awk '{print $NF}')

if [ -n "${file_name}" ];then
#修改文件权限
for file in ${file_name}
do
if [ -f "${file}" ];then
echo "chmod ${file_permission} ${file}" >> ${WORKDIR}/file_permission.log
chmod ${file_permission} ${file}
fi
done

#修改文件上一级目录的权限
for parent_dir in ${file_name}
do
echo ${parent_dir%/*} >> ${WORKDIR}/file_tmp.txt
done
sort -r ${WORKDIR}/file_tmp.txt | sort -u >> ${WORKDIR}/parent_dir.txt #对相同目录去重后保存到parent_dir.txt
[ -f ${WORKDIR}/file_tmp.txt ] && rm -rf ${WORKDIR}/file_tmp.txt

for parent_dir in $(cat parent_dir.txt)
do
if [ -d "${parent_dir}" -a "${parent_dir}" != "/tmp" -a "${parent_dir}" != "/" ];then
echo "chmod ${dir_permission} $parent_dir" >> ${WORKDIR}/file_permission.log
chmod ${dir_permission} ${parent_dir}
local line=$(grep -nw "${parent_dir}$" ${FILE_PATH} |awk -F':' '{print $1}') #提取要删除目录路径所在的行数
[[ "${line}" -gt 0 ]] && sed -i "${line}d" ${FILE_PATH}
fi
done

#删除安全扫描结果文件中处理过的文件
sed -i "/\.${suffix_name}$/d" ${FILE_PATH}
echo "INFO: .${suffix_name}文件修改完成"
else
echo "debug: 没有匹配到.${suffix_name}文件"
fi
}

######################主程序######################
for suffix in ${SUFFIX_NAME[@]}
do
case $suffix in
h|sh|py|jar)
Modify_Permission "${suffix}" "550" "550";; #第一个550表示文件权限,第二个550表示文件上一级目录权限
log)
Modify_Permission "${suffix}" "640" "750";;
esac
done