На самом деле доменное имя www.php53.staging-crm.com
дочерний домен php53.staging-crm.com
. Они могут или не могут отобразиться на тот же адрес. В Вашем случае оба отображаются на двух различных IP-адресах.
Логика является неправильной. Вы думаете, что этот файл не должен был быть перечислен, потому что он принадлежит user123
и имеет пользователя r
набор битов. Однако это перечислено, потому что это соответствует второму критерию (это принадлежит группе user123
и имеет группу r
разрядный сброс).
Ваша вторая версия работает из-за одного из законов de Morgan: отрицание логического осуществления операции ИЛИ группы операторов логически эквивалентно Выполнению операции "И" отрицание отдельных операторов. Другими словами:
! ( A || B || C ) == ( !A && !B && !C )
Так работа find
ищет файл это
user123
и читаемый упомянутым пользователем) Иuser123
и читаемый упомянутой группой) Ив то время как первое find
ищет файл это
user123
и не читаемый упомянутым пользователем ИЛИuser123
и не читаемый упомянутой группой ИЛИ (если Вы завершили его),Таким образом, файл, соответствующий ЛЮБОМУ из вышеупомянутых 3 критериев (и не обязательно все), был бы перечислен, как Вы видели.
Править
Случайно (после того, чтобы посмотреть Ваш профиль), я - большой поклонник Вашей книги O'Reilly :)
Существует намного намного больше вещей учесть, чтобы проверить, есть ли у пользователя доступ к файлу через данный путь:
За исключением фактического переключения всего 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 \)
Причем идея состоит в том, что, если файл принадлежит пользователю, все другие полномочия не важны. В противном случае затем, если файл является, находящимся в собственности группы какой-либо из групп пользователя, то "другое" разрешение не важно.
access()
так как это использует тот же код ядра как open()
. Таким образом sudo -u user123 find /start -readable
лучшее решение если sudo
опция.
– TomOnTime
29.08.2013, 03:13
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
...
( !A && !B && !C )
но я переместился!
во внутреннюю часть каждой части, которая не допустима.Спасибо! – TomOnTime 29.08.2013, 03:16