centos 如何检查多个文件中的权限是否不超过某个级别?

6vl6ewon  于 2022-11-08  发布在  其他
关注(0)|答案(5)|浏览(180)

我希望确保/etc/file 1和/etc/file 2的允许值不超过644。我已尝试

if [[ `stat /etc/file1 --format=%a | cut -b 1` -le "6" -a `stat /etc/file2 --format=%a|cut -b 1` -le 6 ]]; then echo "good"; else echo "bad"; fi;

但我得到了“猛击:条件表达式bash中语法错误:'-a'“附近有语法错误
我的计划是重复三次(权限的每个字节一次)。
我也不确定这两个测试是否工作正常,因为我不能让它们在测试之外运行。

cbjzeqam

cbjzeqam1#

我假设“更高权限”是指file1或file2具有的任何高于或超过644的额外权限。
以下是一些例子:

  • 664的权限更大,因为“group”现在可以写入文件。
  • 700比644的权限大,因为即使“group”和“other”的权限较小,“owner”的权限较大
  • 640是较不宽容的,因为“其他”不能再阅读,它可以在

这基本上意味着,与644相比,file1或file2中至少设置了一个额外的位。因此,如果对644和file1权限进行AND运算,则结果是这两个权限共有的位。
假设file1是640。644 AND 640将得到640。因为结果与file1的权限相同,所以您知道file1的权限至少是644的子集。
假设file2是700。644 AND 700将得到600。600与700不相同,因此file2中一定设置了644没有的位(即不同的权限)。


# !/bin/bash

BASEPERM=644

for FILE in /etc/file1 /etc/file2; do
        COMPARISON=$(stat -c '%a' "$FILE")
        RESULT=$(printf '%o' $((8#$BASEPERM & 8#$COMPARISON))) # AND the permissions
        if [[ $RESULT -eq $COMPARISON ]]; then # If the result is the same as the file's permissions...
                echo "Not more permissive" # ...then you know the file has no more permissions than the base permission
        else
                echo "More permissive"
        fi
done
dohp0rv5

dohp0rv52#

假设“比666更允许”的意思是“设置了执行位”,那么我认为

find $path -perm /111

做你想做的事。
扩展到644权限会使find命令类似于:

find $path -perm /100 -o \( -perm /044 -a -perm /033 \)

我想是的。
我觉得可能有一个聪明的方法来从所需的权限到查找模式,但我必须给予更多的思考。

66bbxpm5

66bbxpm53#

您可以用更简单的方法来执行此操作:
最大权限=“666”

if [ `stat /etc/profile --format=%a` -gt $maxperms ]
then
   echo "TOO PERMISSIVE"
else
   echo "FINE"
fi

哎呀,第二刀:

for d in `stat test.txt --format=0%a | fold -w1`
do 
   if [ $d -gt "6" ] 
   then 
      echo "TOO PERMISSIVE"
      exit
   else
      echo "FINE"
   fi
done
hmmo2u0o

hmmo2u0o4#

你可以一点一点地比较:


# !/bin/bash

function has_good_perm {
    local FILE STAT X
    for FILE; do
        STAT=$(exec stat -c '%a' "$FILE")
        X=${STAT:0:1}
        (( X & 1 )) && return 1               ## False if first number has executable bit e.g. 7, 5, 1
        X=${STAT:1:1}
        (( (X & 1) || (X & 2) )) && return 1  ## False if second number has executable bit or writable bit e.g. 7, 6, 5, 3, 1
        X=${STAT:2:1}
        (( (X & 1) || (X & 2) )) && return 1
    done
    return 0
}

if has_good_perm /etc/file1 /etc/file2; then
    echo "All files are good!"
else
    echo "Something's bad."
fi

或者

function has_good_perm {
    local STAT X
    STAT=$(exec stat -c '%a' "$1")
    X=${STAT:0:1}
    (( X & 1 )) && return 1
    X=${STAT:1:1}
    (( (X & 1) || (X & 2) )) && return 1
    X=${STAT:2:1}
    (( (X & 1) || (X & 2) )) && return 1
    return 0
}

for FILE in /etc/file1 /etc/file2; do
    if has_good_perm "$FILE"; then
        echo "Good file: $FILE"
    else
        echo "Bad file: $FILE"
    fi
done
dffbzjpn

dffbzjpn5#

如果您需要“比644更允许”,则实际上您搜索1338中是否有 any 位(即:6448 XOR 7778)的值。
然后,根据man find

-perm /mode
        **Any**of the permission bits mode are set for the file.   Symbolic
          modes  are  accepted in this form.  You must specify `u', `g' or
          `o' if you use a symbolic mode.  See the  EXAMPLES  section  for
          some  illustrative  examples.  If no permission bits in mode are
          set, this test matches any file (the idea here is to be  consis‐
          tent with the behaviour of -perm -000).

这样就可以了

find $path -perm /133

或者更确切地说,是关于您的特定需求:

BADFILES=$(find /etc/file1 /etc/file2 -perm /133)
if [ -n "$BADFILES" ]
then
    echo 'Bad!' 1>&2
fi

相关问题