Найдите файлы, которые не может считать пользователь?

На самом деле доменное имя www.php53.staging-crm.com дочерний домен php53.staging-crm.com. Они могут или не могут отобразиться на тот же адрес. В Вашем случае оба отображаются на двух различных IP-адресах.

11
29.08.2013, 04:52
3 ответа

Логика является неправильной. Вы думаете, что этот файл не должен был быть перечислен, потому что он принадлежит user123 и имеет пользователя r набор битов. Однако это перечислено, потому что это соответствует второму критерию (это принадлежит группе user123 и имеет группу r разрядный сброс).

Ваша вторая версия работает из-за одного из законов de Morgan: отрицание логического осуществления операции ИЛИ группы операторов логически эквивалентно Выполнению операции "И" отрицание отдельных операторов. Другими словами:

 ! ( A || B || C ) == ( !A && !B && !C )

Так работа find ищет файл это

  • Не (принадлежавший пользователю user123 и читаемый упомянутым пользователем) И
  • Не (принадлежавший группе user123 и читаемый упомянутой группой) И
  • Не читаемо миром.

в то время как первое find ищет файл это

  • Принадлежит пользователю user123 и не читаемый упомянутым пользователем ИЛИ
  • Принадлежит группе user123 и не читаемый упомянутой группой ИЛИ (если Вы завершили его),
  • Не читаемо миром

Таким образом, файл, соответствующий ЛЮБОМУ из вышеупомянутых 3 критериев (и не обязательно все), был бы перечислен, как Вы видели.

Править

Случайно (после того, чтобы посмотреть Ваш профиль), я - большой поклонник Вашей книги O'Reilly :)

7
27.01.2020, 19:58
  • 1
    Спасибо за анализ. Да, это было неправильное использование закона Morgan. Я пытался сделать ( !A && !B && !C ) но я переместился ! во внутреннюю часть каждой части, которая не допустима.Спасибо! –  TomOnTime 29.08.2013, 03:16
  • 2
    P.S. Я рад, что Вы - поклонник моей книги! Мне любопытно, в каком языке Вы читаете его. –  TomOnTime 29.08.2013, 03:20
  • 3
    @TomOnTime, конечно. Я пытаюсь прочитать любую книгу на ее языке оригинала, если я могу помочь ей. –  Joseph R. 29.08.2013, 03:29

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

  • Владелец файла
  • группа файла
  • ACLs в файле
  • uid, ценуроз и дополнительные ценурозы пользователя
  • поисковый доступ к любому продвижению компонента контура в тот файл.
  • является ли файл символьной ссылкой
  • полномочия применяются по-другому для пользователей идентификатора 0.
  • возможно больше средств защиты как SELinux...

За исключением фактического переключения всего uids и ценурозов к тем из пользователя и проверяют, очень трудно реализовать ту же логику как, что делает система.

С zsh Вы могли сделать (как корень):

readable() (
  USERNAME=$u
  [ -r "$REPLY" ]
)
u=some-user
print -rl -- **/*(DoN^+readable)

Или с perl:

find . -print0 | sudo -u some-user perl -Mfiletest=access -l -0ne '
  print unless -r'

Это в обоих случаях, убывание дерево каталогов как root но тест для доступа к файлу как соответствующий пользователь.

Выполнение find -readable как some-user не будет в случаях, поскольку это не сможет пойти мимо каталогов, для которых у пользователя нет доступа или никакого разрешения чтения (но возможно доступа).

Только рассматривая разрешение и владение самого файла (и не ACLs или компоненты контура...), Вам нужно, по крайней мере (здесь синтаксис GNU):

u=some-user; g=$(id -G "$u" | sed 's/ / -o -group /g'); IFS=" "
find . ! \( -user "$u" -perm -u=r -o \
          ! -user "$u" \( -group $g \) -perm -g=r -o \
          ! -user "$u" ! \( -group $g \) -perm -o=r \)

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

7
27.01.2020, 19:58
  • 1
    у ACLs и других факторов. Только 100%-я корректная оценка access() так как это использует тот же код ядра как open(). Таким образом sudo -u user123 find /start -readable лучшее решение если sudo опция. –  TomOnTime 29.08.2013, 03:13
  • 2
    @TomOnTime. Хорошо не, если Вы используете sudo -u user123 find -readable, это не сообщит о файлах в каталогах, которые Вы не можете ввести, или в каталогах Вы не можете читать (таким образом, будут ложные отрицательные стороны и ложные положительные стороны). Вот почему я предлагаю использовать zsh для убывания дерева каталогов как корень и делают access() ([ -r ... ]) как фактический пользователь (установка $USERNAME в zsh изменения весь uids и ценурозы как sudo был бы). –  Stéphane Chazelas 29.08.2013, 09:59

Тестовая среда:

$ sudo tree -fp /tmp/del
/tmp/del
├── [drwxr-xr-x]  /tmp/del/1
│   └── [-rw-r--r--]  /tmp/del/1/f1
├── [d---------]  /tmp/del/2
│   └── [-rw-------]  /tmp/del/2/f1  <-- this filepath is not accessible for ! root
└── [drwxr-xr-x]  /tmp/del/3
    └── [-rw-r--r--]  /tmp/del/3/f1

Полный выход:

$ sudo find /tmp/del/ -type f -exec sudo -u user123 ls {} \;
/tmp/del/3/f1
/tmp/del/1/f1
ls: cannot access '/tmp/del/2/f1': Permission denied  <-- required filepath

Требуемый выход "Грязный":

# Just redirect stdout
>/dev/null sudo find /tmp/del/ -type f -exec sudo -u user123 ls {} \; 
ls: cannot access '/tmp/del/2/f1': Permission denied

Многоразовый код

Просто скройте stdoutи покажите вместо него stderr:

function xfind() { 2>&1 >/dev/null sudo find "${2}" -type f -exec sudo -u "${1}" ls {} \; | grep -o "cannot access.*$"; }

Пример использования "Production" :чего я не вижу в доме root:

$ xfind $USER /root
cannot access '/root/.cache/dconf/user': Permission denied
cannot access '/root/.cache/gstreamer-1.0/registry.x86_64.bin': Permission denied
...
0
19.06.2020, 09:15

Теги

Похожие вопросы