Как я могу проверить, разрешены ли разрешения не более, чем определенный уровень в нескольких файлах?

126
12

Я хочу убедиться, что /etc/file1 и /etc/file2 не более допустимы, чем 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: синтаксическая ошибка в условном выражении bash: синтаксическая ошибка рядом с -a"

Мой план с вышеизложенным - просто повторить его три раза (по одному для каждого байта разрешения).

Я также не уверен, что любой тест работает правильно, потому что я не могу заставить их работать за пределами теста.

спросил(а) 2021-01-19T18:42:29+03:00 6 месяцев, 1 неделя назад
1
Решение
65

Предполагая, что с помощью "более допустимого, чем 666" вы просто означаете "имеет бит бит выполнения", то я верю

find $path -perm /111

делает то, что вы хотите.

Расширение до 644 разрешений позволяет найти команду примерно так:

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

Я думаю.

Я чувствую, что есть вероятный умный способ получить от требуемых разрешений к шаблонам поиска, но я должен был бы дать больше мысли.

ответил(а) 2021-01-19T18:42:29+03:00 6 месяцев, 1 неделя назад
64

Вы можете сделать это гораздо проще:

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

ответил(а) 2021-01-19T18:42:29+03:00 6 месяцев, 1 неделя назад
45

Вы можете сравнить их по частям:

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

ответил(а) 2021-01-19T18:42:29+03:00 6 месяцев, 1 неделя назад
45

Если вам нужно "более допустимое, чем 644", вы фактически выполняете поиск, если установлены бит в 133 8 (то есть: 644 8 XOR 777 8 ).

Затем, по словам 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

ответил(а) 2021-01-19T18:42:29+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема