Я привычка дает Вам точный код, но может дать Вам шаги для достижения этого:
Найдите владельца каталога. Если это соответствует user
на который Вы ищете, затем проверяете полномочия владельца на том каталоге. Если это r+x(5)
или r+w+x(7)
, затем пользователь может искать в том каталоге, иначе нет.
Если владелец каталога не соответствует пользователю, проверьте группу каталога и узнайте ли вводимый user
принадлежит той группе или нет. Если пользователь принадлежит. Проверьте полномочия группы на том каталоге. Если это r+x(5)
или r+w+x(7)
, затем пользователь может искать в том каталоге, иначе нет.
Если вводимый user
не принадлежит группе каталога, проверяют другие полномочия на том каталоге. Если это r+x(5)
или r+w+x(7)
, затем пользователь может искать в том каталоге, иначе нет.
Я думаю, что вышеупомянутый алгоритм выполнит задачу, которую Вы хотите.
Править:
Метод 1:
Можно использовать, находят команду для этого:
$ find / -maxdepth 1 -type d -perm -u=rx
Это найдет все каталоги внутри / до одного уровня с полномочиями пользователя как по крайней мере (read+execute).
Метод 2:
$ stat <filename/directoryname> | grep Access | head -1 | awk 'BEGIN{FS="[/)]"} {print $2}'
Это даст Вам полномочия в rwx нотации (например, drwxr-xr-x)
$ stat <filename/directoryname> | grep Access | head -1 | awk 'BEGIN{FS="[(/]"} {print $2}'
Это даст Вам полномочия в 755 нотациях (например, 0755)
Вы можете делать как хотите, единственное, что вы должны убедиться, это то, что новый серийный номер больше старого.
Сказав это, я бы порекомендовал подход на основе меток времени по схеме вроде:
YYYYMMDDxx
где xx
начинается с 00
и увеличивается для всех правок в этот конкретный день ( при редактировании в другой день вы сбрасываете xx
на 00
)
Основным преимуществом этой схемы является то, что вы также знаете дату последней модификации вашего файла зоны на первый взгляд.
Это также делает увеличение серийного номера более надежным.
В качестве альтернативы можно начать с 1
и просто увеличивать каждый раз при редактировании файла.
Если серийный номер уже основан на метке времени (и 2015040500
выглядит очень похоже), вы, вероятно, придерживаетесь этого решения (даже если не вами) и используйте логическую схему . преемник 2015042200
Сценарий bash ищет:
12345 ; Serial
в каталоге / etc / bind / zone
. Он должен соответствовать любому числу перед ; Серийный
(с учетом регистра). И замените его форматом ГГГГММДДxx
.
#!/bin/bash
ZONES_PATH="/etc/bind/zones"
DATE=$(date +%Y%m%d)
# we're searching for line containing this comment
NEEDLE="Serial"
for ZONE in $(ls -1 $ZONES_PATH) ; do
curr=$(/bin/grep -e "${NEEDLE}$" $ZONES_PATH/${ZONE} | /bin/sed -n "s/^\s*\([0-9]*\)\s*;\s*${NEEDLE}\s*/\1/p")
# replace if current date is shorter (possibly using different format)
if [ ${#curr} -lt ${#DATE} ]; then
serial="${DATE}00"
else
prefix=${curr::-2}
if [ "$DATE" -eq "$prefix" ]; then # same day
num=${curr: -2} # last two digits from serial number
num=$((10#$num + 1)) # force decimal representation, increment
serial="${DATE}$(printf '%02d' $num )" # format for 2 digits
else
serial="${DATE}00" # just update date
fi
fi
/bin/sed -i -e "s/^\(\s*\)[0-9]\{0,\}\(\s*;\s*${NEEDLE}\)$/\1${serial}\2/" ${ZONES_PATH}/${ZONE}
echo "${ZONE}: "
grep "; ${NEEDLE}$" $ZONES_PATH/${ZONE}
done
Измененная версия для конфигурации привязки, управляемая в репозитории git
, которая обновляет серийный номер только для измененного файла зоны:
#!/bin/bash
ZONES_PATH="$(pwd)/zones"
REPO_PATH="$(git rev-parse --show-toplevel)"
DATE=$(date +%Y%m%d)
NEEDLE="Serial"
for ZONE in $(git diff --name-only --diff-filter=AM `git merge-base origin/master HEAD` $ZONES_PATH) ; do
curr=$(/bin/grep -e "${NEEDLE}$" ${REPO_PATH}/${ZONE} | /bin/sed -n "s/^\s*\([0-9]*\)\s*;\s*${NEEDLE}\s*/\1/p")
if [ ${#curr} -lt ${#DATE} ]; then
serial="${DATE}00"
else
prefix=${curr::-2}
if [ "$DATE" -eq "$prefix" ]; then # same day
num=${curr: -2} # last two digits from serial number
num=$((10#$num + 1)) # force decimal representation, increment
serial="${DATE}$(printf '%02d' $num )" # format for 2 digits
else
serial="${DATE}00" # just update date
fi
fi
/bin/sed -i -e "s/^\(\s*\)[0-9]\{0,\}\(\s*;\s*${NEEDLE}\)$/\1${serial}\2/" ${REPO_PATH}/${ZONE}
echo "${ZONE}: "
grep "; ${NEEDLE}$" ${REPO_PATH}/${ZONE}
done
Примечание: вы не должны вносить более 99 изменений в течение одного дня: )