Traverse to determine whether files in certain Linux directories have execution permissions

#!/bin/bash
#:lwp

#收集异常信息文件存放目录
COLLECT_CHECK_SAVE_PATH="/data"

#版本信息
#VERSION_PATH="/appversion"

#检测目录列表
DIR_LIST=(
/usr/bin/
/usr/sbin/
/bin/
/sbin/
)

#允许无执行权限文件
FILE_LIST=(
dont-tar-files.list
)

if [ -f "${COLLECT_CHECK_SAVE_PATH}/permissionfile" ]; then
	cat /dev/null >"${COLLECT_CHECK_SAVE_PATH}/permissionfile"
else
	touch "${COLLECT_CHECK_SAVE_PATH}/permissionfile"
fi                            

#重定向文件或创建文件失败则退出
if [ ! $? -eq 0 ];then
	exit
fi
	
#标示权限异常信息文件是否为空
info_perm=""
per_val=""
num=0
dir_name=""
file_perssiom=""
file_name=""
get_file=""
flag=0
for dir_name in "${DIR_LIST[@]}"
do
	file_perssiom=$(ls -l "$dir_name")
	echo "$file_perssiom" | sed -n "2,$"p | while read -r line    #sed -n "2,$"p  表示从第二行到最后一行
	do
		num=0
		flag=0
		per_val=$(echo "$line" | awk '{print $1}')
		#对权限的x进行计数
		num=$(echo "$per_val" | tr -cd x | wc -c)                                         
		if [ "$num" -lt 3 ];then
			get_file=$(echo "$line" | awk '{print $9}')
				
			#判断无执行权限的文件是否是允许文件
			for file_name in "${FILE_LIST[@]}"
			do
				if [ x"$file_name" = x"$get_file" ];then
					flag=1
				fi
			done
			#否则,则存在无运行权限的文件,将文件名echo到记录文件中	
			if [ "$flag" -eq 0 ];then
				echo "$dir_name $(echo "$line" | awk '{print $9" "$1" "$6"-"$7"-"$8}')" >>"${COLLECT_CHECK_SAVE_PATH}/permissionfile"
			fi
		fi
	done
done

info_perm=$(cat "${COLLECT_CHECK_SAVE_PATH}/permissionfile")
#x是一个占位符,用于避免变量为空时出现语法错误;这里判断记录文件是否为空,为空则删除记录文件
if [ x"$info_perm" = x ];then
	rm "${COLLECT_CHECK_SAVE_PATH}/permissionfile"
	echo "success.no error"
fi
#如果不为空,则输出记录文件
if [ -f "${COLLECT_CHECK_SAVE_PATH}/permissionfile" ];then
	echo "ERROR! ${COLLECT_CHECK_SAVE_PATH}/permissionfile exists, include NOPERMISSION file"
fi

Code comments can be viewed directly

Guess you like

Origin blog.csdn.net/Mr_wilson_liu/article/details/125331510
Recommended