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

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

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

Например, когда я захожу на рабочий стол своего Mac, щелкаю правой кнопкой мыши по файлу «A», затем «Получить информацию», затем внизу у меня есть «Общий доступ и разрешения», где я могу добавить пользователя, например, «popo», а затем указать, что он может «читать и писать» этот файл.

Затем я хочу использовать командную строку, чтобы получить все файлы, которые POPO может читать и записывать, и только эти (я хочу получить «A» в приведенном выше примере).

Все мои исследования на данный момент привели меня к чему-то вроде:

find /Users/Me/Desktop -user popo -perm 777

Но я ничего не получаю.

Что не так с вышеизложенным findи как мне действовать дальше?

решение1

Вам нужно искать файлы, которые являются RW для всех ИЛИ RW для uid пользователя ИЛИ RW для всех групп, в которых состоит пользователь. Но это немного сложнее. Как указалздесьСтефан Шазелас, если файл принадлежит пользователю, то учитываются ТОЛЬКО права владельца, а если файл принадлежит группе, членом которой является пользователь, то учитываются только права группы.

Поэтому нам нужно проверить «владелец=RW или (не владелец и группа=rw) или (не владелец и не группа и другие=rw)»

Вы можете получить список групповых идентификаторов, членом которых является пользователь, с помощью id -G. Это можно использовать для построения командной строки find со стандартной подстановкой команд оболочки.

Мой первоначальный ответ был однострочным, но эта работа слишком сложна, чтобы делать ее однострочной. Вот скрипт оболочки bash, который делает эту работу.

#! /bin/bash

U="$1"      # username to do perm search on - e.g. popo
TOPDIR="$2" # starting directory for search - e.g. /Users/Me/Desktop

# permissions to search for - defaults to "rw"
PERMS=${3:-rw}

# permission bits "style".  "/"=ANY or "-"=ALL. defaults to / 
#
# see find(1) and search for '-perm -mode' or '-perm /mode' for 
# details on how this works.
PSTYLE=${4:-/}

# construct a find expression specifying all groups that the user
# is a member of
GIDS="$(for i in $(id -G "$U"); do echo -n " -gid $i -o "; done)"
GIDS=$(echo "$GIDS" | sed -e 's/ -o $//')    # strip trailing " -o "

find "$TOPDIR" \
   \( -user "$U" -perm ${PSTYLE}u=$PERMS \) \
   -o \( -not -user "$U" -a \( $GIDS \) -perm ${PSTYLE}g=$PERMS \) \
   -o \( -not -user "$U" -not \( $GIDS \) -perm ${PSTYLE}o=$PERMS \) 

Этот скрипт должен быть запущен как root. Другие пользователи могут не иметь необходимых прав для просмотра всех каталогов, которые может просматривать popo.

Примечание: Я протестировал это на системе Debian Linux, используя последние версии idиз GNU Coreutils и findиз GNU findutils. Реализации idи для Mac findмогут отличаться, у меня нет Mac для тестирования. Если это отличается, проверьте страницы руководства Mac для idи find- то, что нужно искать и что может потребовать изменения для соответствия Mac, это параметры -Gи -uдля idи -perm /или параметры '-perm -' для find.

решение2

Это связано с тем, что -userопция ищет файлы, в которых указан пользователь, являющийся владельцем файла, а это не ваш случай.

Похоже, самый простой способ сделать то, что вам нужно, — выполнить команду под пользователем popo:

find /Users/Me/Desktop -readable

решение3

sudo find . -print0 | 
  sudo -u popo perl -Mfiletest=access -l -0ne '
    print if -r && -w'

Видетьчто ответ на почти идентичный вопроспочему проверка разрешений обычно не работает.

Связанный контент