Как узнать, есть ли у данного пользователя права на чтение и / или запись для заданного пути

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

Предположим, я являюсь root, и поэтому я могу пройти через всю файловую систему, но я не могу запускать «sudo» или «su».

У меня есть заданный пользователь и заданный путь.

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

Я знаю, что это звучит просто, но имейте в виду, что:

  • Мы не и не можем стать пользователем.
  • Мы не можем просто полагаться на окончательные разрешения каталога, поскольку разрешения выше по пути могут блокировать доступ к окончательному каталогу.
  • В наш век унаследованных групп мы также не можем полагаться только на разрешения группы каталогов.

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


person Eduo    schedule 20.05.2012    source источник
comment
Ваши предположения выглядят обоснованными отсюда. Не забывайте о разрешениях на выполнение для каталога.   -  person Piskvor left the building    schedule 20.05.2012
comment
я не понимаю, почему вы не можете su   -  person    schedule 20.05.2012
comment
hop: Какова бы ни была причина, это постановка проблемы. Не могу использовать x, нельзя ответить тогда, используйте x. В реальной жизни эта проблема возникает, если вы хотите сообщить пользователю, что созданный ими общий ресурс не будет доступен для чтения пользователям, которым они предоставляют доступ. Например, при создании общедоступной гостевой папки (чей пользователь за кулисами на самом деле никто), в которой гости не смогут читать или писать.   -  person Eduo    schedule 20.05.2012
comment
@hop: У меня нет этой проблемы в реальной жизни, это не обязательно означает, что это не реальная проблема.   -  person Piskvor left the building    schedule 20.05.2012
comment
@Eduo: этот сайт не для постановки пазлов.   -  person    schedule 20.05.2012
comment
Писквор: Полагаю, мне придется пересечь. Спасибо за напоминание об исполняемых битах. Просто слишком дорого, что я хотел найти другой, лучший и более эффективный способ.   -  person Eduo    schedule 20.05.2012
comment
@Eduo: извини, я даже не могу разобрать твой последний комментарий. в любом случае, просто дайте пользователю инструмент, который все настраивает правильно, тогда нет необходимости проверять.   -  person    schedule 20.05.2012
comment
Я не занимаюсь головоломками. Я не знаю лучшего ответа, чем тот, на который я намекнул. Мне нужно предоставить пользователю возможность узнать, доступна ли папка, которую он выбирает для совместного использования, через интерфейс, который они используют. Механизм общего доступа к файлам работает от имени пользователя root, но не внешнего интерфейса. Пользователь может использовать интерфейс для создания нового общего ресурса, к которому у него нет доступа. Таким образом, внешний интерфейс должен сообщить пользователю, смогут ли конечные пользователи, которые могут использовать общий ресурс. Вот и все. Извините, если вы тоже не можете разобрать этот комментарий, я не знаю, насколько яснее это сделать.   -  person Eduo    schedule 20.05.2012
comment
@hop, если это не реальная проблема, объясните, почему в другой ОС (Windows) оболочка даже имеет особую функцию, позволяющую просмотреть действующие разрешения файловой системы для любого данного пользователя. Эта функция может быть очень полезной в некоторых ситуациях, например, чтобы уберечь ваших пользователей от процесса проб и ошибок.   -  person stakx - no longer contributing    schedule 21.05.2012
comment
Можно ли установить euid, или вы считаете, что это то же самое, что стать пользователем?   -  person Hasturkun    schedule 21.05.2012
comment
@stakx: ACL - это совсем другое дело   -  person    schedule 21.05.2012


Ответы (4)


Отметьте меня гуру скриптинга!

check_access() {
  checked_file=$1
  target_user=$2
  result=PASS

  groups=`id -G $target_user | sed -e 's| | -o -group |g' -e 's|^|\\( -group |' -e 's|$| \\)|'`

  while [ $checked_file != / ]; do 
    find $checked_file -maxdepth 0 \
      -type f \( \
        \( -user $target_user -perm 0400 \) \
        -o \( $groups -perm 0040 \) \
        -o -perm 0004 \
      \) -o -type d \( \
        \( -user $target_user -perm 0100 \) \
        -o \( $groups -perm 0010 \) \
        -o -perm 0001 \
      \) >/dev/null 2>&1 || result=FAIL
    checked_file=`dirname $checked_file`
  done
  echo $result
}
person kworr    schedule 07.06.2012

лучший способ - проверить через самого пользователя:

if sudo su - $user_to_check -c "[[ -r $path_to_check ]]"
then echo "$user_to_check can read $path_to_check"
else echo "$user_to_check can not read $path_to_check"
fi
if sudo su - $user_to_check -c "[[ -w $path_to_check ]]"
then echo "$user_to_check can write $path_to_check"
else echo "$user_to_check can not write $path_to_check"
fi
person mpapis    schedule 24.06.2012

На самом деле я не могу дать полный ответ и не могу добавить ничего существенного к вашим собственным идеям, кроме, возможно, следующего:

Я подозреваю, что общего подхода к проверке эффективных прав доступа не существует просто потому, что права доступа сильно зависят от базовой файловой системы (систем). Например, проверка прав доступа работает совершенно иначе в файловых системах, использующих стандартные флаги rwx Unix (например, Linux ext2, ext3), чем в файловых системах, поддерживающих ACL (например, XFS или NTFS).

Может быть несколько конкретных инструментов командной строки, которые делают то, что вы хотите делать для определенных типов файловых систем. (Аналогия: такие инструменты, как fsck, mkfs, могут существовать в зависимости от типа файловой системы.)

Особенно с UNIX-подобными операционными системами, где все типы файловых систем могут быть смонтированы в одной большой структуре каталогов, предполагая, что только один конкретный механизм разрешений может привести к проблемам.

Если вы создаете собственное решение этой проблемы, сначала подумайте об этом факте, а затем решите, какие именно механизмы прав доступа вы хотите поддерживать. (Я не уверен, но могу представить, что спецификация Unix / POSIX предписывает rwx флаги прав доступа как минимум, который должен поддерживать каждый Unix.)

person Community    schedule 21.05.2012

ls -l <file-name or dir-name>

Предположим, вы хотите проверить права доступа к каталогу загрузок. Введите ls -l uploads. Результат будет таким:

total 20
drwxrwxr-x 2 tomcat ec2-user 4096 Nov  5 04:21 deals
drwxrwxr-x 2 tomcat ec2-user 4096 Nov  5 04:25 gallery-images
drwxrwxr-x 3 tomcat ec2-user 4096 Nov  5 04:25 hotels
drwxrwxr-x 3 tomcat ec2-user 4096 Nov  5 04:28 rooms
drwxrwxr-x 3 tomcat ec2-user 4096 Nov  5 04:32 temp
person Deepak Pandey    schedule 18.08.2016
comment
Если вы считаете, что это правильный ответ, пожалуйста, поясните, почему. - person Gary Evans; 18.08.2016
comment
Используя ls -l <file-name or dir-name>, вы можете получить разрешения для каждого пользователя @G - person Deepak Pandey; 08.11.2016