2014-07-09 41 views
0

我要確保在/ etc /文件1和/ etc /文件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; 

,但我得到「慶典:在條件表達式語法錯誤 慶典:語法錯誤附近`-a'「​​

我的計劃與上述只是重複三次(每個字節的權限)。

我也不確定任一測試是否正常工作,因爲我無法讓它們在測試之外運行。

+0

「更多permi可能比666「只是意味着」有一個執行位集「不是嗎? –

+0

我想是的。但我需要的實際數字是644。我會改變它來反映這一點。 – michaelAdam

回答

1

你可以在一個更簡單的方式做到這一點:

maxperms = 「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 
+0

問題是077小於666,但更寬容。 – michaelAdam

1

假設通過「比666更容易」你st意味着「有一個執行位集」,那麼我相信

find $path -perm /111 

做你想做的。

延伸到644權限,使該find命令是這樣的:

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

我想。

我覺得有可能是一個聰明的方式來獲得所需的權限,以找到模式,但我不得不給更多的想法。

+0

謝謝,我會稍後檢查它是否有效。 – michaelAdam

0

您可以通過點點滴滴對它們進行比較:

#!/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 
0

如果你需要 「比644更允許」,你其實搜索如果在133 8任位(ie:644 XOR 777 )。

然後,根據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 
相關問題