Использование оболочки 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. Я понятия не имею, должно ли это быть более безопасным, поскольку я не охранник.

Другие вопросы по тегам