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

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

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

Я данного пользователя и данного пути.

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

Я знаю, это звучит легко, но имейте в виду что:

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

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

4 ответов


пометьте меня гуру сценариев!

check_access() {
  checked_file=
  target_user=
  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
}

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

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

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

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

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


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

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

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