Порада капелюха до @ gniourf_gniourf для усунення основної помилки.
Ця відповідь намагається дати огляд існуючих відповідей та обговорити їх тонкощі та відносні достоїнства , а також надати довідкову інформацію , особливо щодо портативності .
Пошук файлів, які можна виконати, може стосуватися двох різних випадків використання :
- орієнтований на користувача : знайдіть файли, які виконуються поточним користувачем .
- файл-орієнтовані : знайти файли , які мають (один або більше) дозвіл на виконання біт набір .
Зауважте, що в будь-якому сценарії може бути доцільним використанняfind -L ...
замість find ...
того, щоб знайти символьні посилання на виконувані файли .
Зауважте, що найпростіший файл, орієнтований на файли - пошук виконавчих файлів із встановленим бітом дозволів, встановленим для ВСІХ трьох принципів безпеки (користувача, групи та інших) - як правило , але не обов'язково дасть ті самі результати, що й орієнтований на користувача сценарій - і це важливо зрозуміти різницю.
Користувач, орієнтований на користувача ( -executable
)
Загальноприйнятий відповідь похвально рекомендує -executable
, ЯКЩО GNU find
доступний.
- GNU
find
поставляється з більшістю дистрибутивів
Linux
- Навпаки, платформи на базі BSD, включаючи macOS, оснащені BSD знахідкою, яка є менш потужною.
- Як вимагає сценарій,
-executable
відповідність лише файлам, які може виконувати поточний користувач (є крайові випадки. [1] ).
BSD find
альтернатива пропонує загальноприйнятому відповідь ( -perm +111
) відповідає на інший , файл заточений питання (як і сам відповідь стан).
- Використання тільки
-perm
для відповіді на користувач заточений питання є неможливим , тому що потрібно, щоб зв'язати в файл користувачів і груп ідентичність з поточним користувачем , в той час як -perm
можна тільки перевірити в файл дозвіл.
Використовуючи лише функції POSIXfind
, на питання не можна відповісти без залучення зовнішніх утиліт.
Таким чином, кращі -perm
може зробити (сам по собі) є наближенням з -executable
. Можливо, більш близьке наближення, ніж -perm +111
це-perm -111
, щоб знайти файли, у яких встановлений виконуваний біт встановлений для ВСІХ головних принципів безпеки (користувача, групи та інших) - це вражає мене як типовий сценарій у реальному світі. Як бонус, він також відповідає POSIX (використовуйте find -L
для включення символьних посилань, див. Далі нижче для пояснення):
find . -type f -perm -111 # or: find . -type f -perm -a=x
Відповідь gniourf_gniourf забезпечує справжній портативний еквівалент-executable
використання-exec test -x {} \;
, хоча і за рахунок продуктивності .
Поєднання -exec test -x {} \;
з -perm +111
(тобто файлами, що мають принаймні один набір виконуваних бітів) може сприяти продуктивності, у якій exec
не потрібно викликати кожен файл (у наступному використовується POSIX-сумісний еквівалент BSD find -perm +111
/ GNU find -perm /111
; див. Далі нижче для пояснення) :
find . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \) -exec test -x {} \; -print
Файл ( -perm
)
- Для того, щоб відповісти на файл заточені питання , то є досить використовувати POSIX-сумісний
-perm
первинний (відомий як тест в термінології знаходить GNU).
-perm
дозволяє перевірити на наявність будь-яких дозволів файлів, а не лише для виконання.
- Дозвіл задається як восьмеричний, так і символічний режими . Вісімкові режими - восьмеричні числа (наприклад,
111
), тоді як символьні режими - це рядки (наприклад, a=x
).
- Символічні режими ідентифікують принципів безпеки як
u
(користувач), g
(група) та o
(інші) або a
посилаються на всі три. Дозволу виражаються x
, наприклад, для виконуваних файлів, наприклад, і призначаються принципалам за допомогою операторів =
, +
і -
; для повного обговорення, включаючи восьмеричні режими, див . специфікацію POSIX для chmod
утиліти .
- У контексті
find
:
- Приставка режиму з
-
(наприклад, -ug=x
) означає: сірникові файли , які мають всі права доступу визначено (але відповідні файли можуть мати додаткові дозволи).
- Наявність без префікса (наприклад
755
) означає: матч файли , які мають цей повний, точний набір дозволів.
- Caveat : І GNU find, і BSD find реалізують додатковий нестандартний префікс із логікою набору "БУДЬ-ЯК-З-Вказаного дозволу-бітів" , але це роблять з несумісним синтаксисом :
- Знайдіть BSD:
+
- Знайдіть GNU:
/
[2]
- Тому уникайте цих розширень, якщо ваш код повинен бути портативним .
- Наведені нижче приклади демонструють портативні відповіді на різні запитання, орієнтовані на файли.
Приклади команд, орієнтованих на файли
Примітка:
- Наступні приклади сумісні з POSIX , тобто вони повинні працювати в будь-якій сумісній з POSIX реалізацією, включаючи пошук GNU та BSD; конкретно, для цього потрібно:
- НЕ використовуючи нестандартні префікси режиму
+
або /
.
- Використання POSIX форм праймерів логічного оператора :
!
для NOT (GNU find і BSD find також дозволяють -not
); Зауважте, що \!
використовується в прикладах, щоб захистити !
від розширення історії оболонок
-a
для AND (GNU find і BSD find також дозволяють -and
)
-o
для АБО (GNU find та BSD find також дозволяють -or
)
- У прикладах використовується символічне режими, оскільки їх легше читати та запам’ятовувати.
- З приставкою режимі
-
, то =
і +
оператори можуть бути взаємозамінними (наприклад, -u=x
еквівалентно -u+x
- якщо ви не застосовувати -x
пізніше, але немає ніякого сенсу робити це).
- Використовувати
,
для приєднання до часткових режимів; І логіка мається на увазі; наприклад, -u=x,g=x
означає, що повинні бути встановлені як користувач, так і виконуваний біт групи.
- Режими не можуть самі виражати негативну відповідність у значенні "збіг, лише якщо цей біт НЕ встановлений"; Ви повинні використовувати окреме
-perm
вираз з НЕ первинним, !
.
- Зауважте, що праймеризовані знахідки (такі як
-print
, або -perm
; також відомі як дії та тести в GNU find) неявно з'єднуються з -a
(логічним AND), і що, -o
можливо, круглі дужки (уникнуті як \(
і \)
для оболонки) необхідні для реалізації логіки АБО.
find -L ...
замість просто find ...
використовується для того, щоб також відповідати символьні посилання на виконувані файли
-L
інструктує знаходити оцінку цілей символьних посилань замість самих символьних посилань; Таким чином, без -L
, -type f
буде ігнорувати символічні посилання в цілому.
# Match files that have ALL executable bits set - for ALL 3 security
# principals (u (user), g (group), o (others)) and are therefore executable
# by *anyone*.
# This is the typical case, and applies to executables in _system_ locations
# (e.g., /bin) and user-installed executables in _shared_ locations
# (e.g., /usr/local/bin), for instance.
find -L . -type f -perm -a=x # -a=x is the same as -ugo=x
# The POSIX-compliant equivalent of `-perm +111` from the accepted answer:
# Match files that have ANY executable bit set.
# Note the need to group the permission tests using parentheses.
find -L . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \)
# A somewhat contrived example to demonstrate the use of a multi-principial
# mode (comma-separated clauses) and negation:
# Match files that have _both_ the user and group executable bit set, while
# also _not_ having the other executable bit set.
find -L . -type f -perm -u=x,g=x \! -perm -o=x
[1] Опис -executable
з man find
моменту пошуку GNU 4.4.2:
Збігає файли, які виконуються, та каталоги, які можна шукати (у сенсі роздільної здатності файлу). При цьому враховуються списки контролю доступу та інші артефакти дозволів, які тест -perm ігнорує. Цей тест використовує системний виклик доступу (2), і тому його можна обдурити серверами NFS, які виконують відображення UID (або кореневу скриньку), оскільки багато систем реалізують доступ (2) в ядрі клієнта і тому не можуть скористатися інформація відображення UID, що зберігається на сервері. Оскільки цей тест базується лише на результаті системного виклику доступу (2), немає гарантії, що файл, для якого цей тест успішно, може бути реально виконаний.
[2] В GNU знайти версії, старші за 4.5.12, також дозволено префікс +
, але цей спершу був застарілий і врешті-решт видалений, оскільки поєднання +
з символічними режимами дає ймовірні результати, оскільки трактується як точна маска дозволів. Якщо ви (а) працювати на версії до 4.5.12 і (б) обмежувати себе восьмеричної режимів тільки, ви могли б піти з використанням +
з як GNU знайти і BSD знайти, але це не дуже гарна ідея.