Использование оболочки bash на RHEL 7 - почему find находит больше файлов, когда я не использую -exec?
Я ищу все файлы setuid/setgid. Когда я не пользуюсь -exec
работает как положено:
# find /usr/bin -type f -perm -4000 -o -perm -2000
/usr/bin/wall
/usr/bin/ksu
/usr/bin/chage
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/fusermount
/usr/bin/passwd
/usr/bin/write
/usr/bin/su
/usr/bin/umount
/usr/bin/gpasswd
/usr/bin/newgrp
/usr/bin/mount
/usr/bin/pkexec
/usr/bin/crontab
/usr/bin/cgclassify
/usr/bin/cgexec
/usr/bin/ssh-agent
/usr/bin/Xorg
/usr/bin/at
/usr/bin/sudo
/usr/bin/locate
/usr/bin/staprun
Когда я использую -exec
Я вернул только часть результатов:
# find /usr/bin -type f -perm -4000 -o -perm -2000 -exec ls -l {} \;
-r-xr-sr-x. 1 root tty 15344 Jan 27 2014 /usr/bin/wall
-rwxr-sr-x. 1 root tty 19536 Aug 21 2015 /usr/bin/write
-rwxr-sr-x. 1 root cgred 15624 Sep 21 2014 /usr/bin/cgclassify
-rwxr-sr-x. 1 root cgred 15584 Sep 21 2014 /usr/bin/cgexec
---x--s--x. 1 root nobody 306304 Sep 24 2015 /usr/bin/ssh-agent
-rwx--s--x. 1 root slocate 40504 Jan 26 2014 /usr/bin/locate
Зачем?
2 ответа
Вы используете только -exec
на правой стороне -o
, Таким образом, он анализируется так:
# What's actually happening
find /usr/bin '(' -type f -perm -4000 ')' -o '(' -perm -2000 -exec ls -l {} \; ')'
Очевидно, это не то, что вы хотите.
Чтобы применить его к обеим сторонам условного обозначения, добавьте несколько скобок для группировки:
# What you want to happen
find /usr/bin -type f '(' -perm -4000 -o -perm -2000 ')' -exec ls -l {} +
Причина в том, что если вы не укажете явное действие, find
предполагает -print
как действие по умолчанию. Когда вы добавляете действие самостоятельно, оно отключает это значение по умолчанию, поэтому только элементы, для которых вы явно указываете действие, получают его.
То есть:
# These commands are all equivalent:
find /usr/bin -type f -perm -4000 -o -perm -2000
find /usr/bin '(' -type f -perm -4000 -o -perm -2000 ')' -print
find /usr/bin '(' '(' -type f -perm -4000 ')' -o '(' -perm -2000 ')' ')' -print
Обратите внимание, что последний, который выставляет предупреждение в поведении по умолчанию: вы, вероятно, хотели -type f
применить к обеим сторонам -o
, но без явной группировки она ставится слева, как явная -exec
или же print
ставится на право.
Мораль этой истории: при использовании -o
в поиске, будьте откровенны в отношении вашей группировки, если вы не уверены, что поведение по умолчанию соответствует вашему.
Хотя я не вижу этого явно упомянутого на странице руководства, я подозреваю, что это может быть что-то преднамеренное, возможно, связанное с безопасностью.
[user@host.local ~]$ for i in `find /usr/bin -type f -perm -4000 -o -perm -2000`;do ls -l $i;done
-r-sr-xr-x 1 root wheel 83472 Mar 12 16:37 /usr/bin/at*
-r-sr-xr-x 1 root wheel 83472 Mar 12 16:35 /usr/bin/atq*
-r-sr-xr-x 1 root wheel 83472 Mar 12 16:35 /usr/bin/atrm*
-r-sr-xr-x 1 root wheel 83472 Mar 12 16:36 /usr/bin/batch*
-rwsr-xr-x 1 root wheel 39024 Dec 3 14:36 /usr/bin/crontab*
-r-sr-xr-x 1 root wheel 76096 Mar 12 16:36 /usr/bin/login*
-r-sr-xr-x 1 root wheel 52400 Mar 12 16:36 /usr/bin/newgrp*
-r-sr-xr-x 1 root wheel 23488 Dec 3 14:36 /usr/bin/quota*
-rwsr-xr-x 1 root wheel 25312 Dec 3 14:35 /usr/bin/su*
-r-s--x--x 1 root wheel 168448 Dec 3 14:35 /usr/bin/sudo*
-r-sr-xr-x 1 root wheel 87952 Mar 12 16:35 /usr/bin/top*
-r-xr-sr-x 1 root tty 24704 Dec 3 14:35 /usr/bin/wall*
-r-xr-sr-x 1 root tty 23808 Dec 3 14:35 /usr/bin/write*
[user@host.local ~]$ find /usr/bin -type f -perm -4000 -o -perm -2000 -exec echo {} \;
/usr/bin/wall
/usr/bin/write
Как вы можете видеть выше, записи, которые не проходят через -exec, принадлежат пользователю root с установленным битом setuid. Я понятия не имею, должно ли это быть более безопасным, поскольку я не охранник.