то есть:
Предположим, что разрешение каталога составляет 700
, а файл в каталоге 570
Тогда действующее разрешение файла 500
Есть ли такая команда, которая перечисляет действующее разрешение путем рекурсивной проверки родительских разрешений?
то есть:
Предположим, что разрешение каталога составляет 700
, а файл в каталоге 570
Тогда действующее разрешение файла 500
Есть ли такая команда, которая перечисляет действующее разрешение путем рекурсивной проверки родительских разрешений?
Нет такой команды и нет простого способа сделать это, тем более, что как для файла, так и для каталогов могут быть установлены ACL в дополнение к традиционным разрешениям, делающим эффективные разрешения для файлов более сложными для вычисления и отображения. Более того, ваш вопрос предполагает, что существует единственный путь к файлу, но символические ссылки, потенциально присутствующие в пути, должны быть сначала разрешены, так как их разрешения не имеют значения, файл может также иметь несколько жестких ссылок, поэтому он может быть доступен из другого каталога. Пользователь также может получить доступ к нему по другому пути, если установлены петлевые /bind-монтирования или пользователь работает в изолированной среде.
В любом случае вы можете выдать себя за пользователя и проверить, доступен ли ему / ей доступ к файлу при доступе к нему по заданному пути.
Что-то вроде:
#!/bin/ksh
[[ $# != 2 ]] && { echo Usage $0 user file; exit ; }
dir=$(\cd $(dirname "$2");/bin/pwd)
file=$(basename "$2")
su $1 ksh -c '
cd $2 2>/dev/null || { echo "---" ; exit ; }
[[ -r "$3" ]] && p=r || p=-
[[ -w "$3" ]] && p=${p}w || p=${p}-
[[ -x "$3" ]] && p=${p}x || p=${p}-
printf "%s %s/%s\n" $p "$2" "$3"
' "$1" "$dir" "$file"
Это покажет действующие права для пользователя на этот конкретный файл, используя традиционный синтаксис rwx. Обратите внимание, что этот сценарий может давать ложные отрицательные результаты, если запускаемый пользователь не имеет привилегий root (или эквивалентных) и не имеет доступа на чтение в целевом каталоге.
Это не так легко решить. В частности, "эффективные" права доступа к файлам (концепция, которая в этом контексте мне неизвестна) определить не так просто.
Вы можете получить доступ к файлу, если все каталоги, ведущие к нему, являются "исполняемыми". Если вы знаете имена файлов, вам не нужен доступ для чтения.
(Например, иногда я делаю домашние каталоги 710
, чтобы дать x
доступ другим членам той же группы. Так что никто другой не видит, что у меня есть в моем ~
, но они могут использовать это, если я скажу им, что там есть.)
Если вопрос касается доступа к существующему файлу, ответ отличается от создания или удаления файла. В последнем случае родительский каталог файла (-to-be) может быть доступен для записи.
OTOH, если у меня нет x
каталога в пути к файлу, я даже не могу определить, существует ли файл, и, следовательно, также не какие разрешения у файла. Вы можете утверждать, что тогда эффективное разрешение будет равно 0
, но я не считаю разумным что-то говорить о правах доступа к файлу, даже если я даже не знаю, существует ли файл.
Но если вы хотите, вы берете маску каждого каталога, делаете & 0111
&
маски вместе, и если есть 0
где должна быть 1
, вы помещаете 0
в "эффективное разрешение" файла.
Для создания и удаления вы определяете действующее разрешение родительского каталога и смотрите, доступен ли он для записи и выполнения.
Таким образом, в каталоге 700
, 570
становится 500
.
Другие ответы верны. Однако вы можете использовать однострочник bash для получения списка разрешений иерархии каталогов. Сначала перейдите в соответствующий каталог, а затем запустите:
pushd .; while [ `pwd` != / ]; do ls -ld `pwd`; cd ..; done; popd