Як я можу знайти лише виконувані файли в певному каталозі в Linux?


156

Як я можу знайти лише виконувані файли в певному каталозі в Linux?


Ось ніби Баш скрипт, це не-погано то , що я можу сказати :) stackoverflow.com/a/20209457/2067125
AjayKumarBasuthkar

Що з використанням стандартної fileкоманди ?
Прорив

4
Для всіх, хто хоче це зробити на Mac (тестовано на OS X 10.9.5): ls -l | egrep '^[^d]..x..x..x.*$' вище наведено список усіх виконуваних файлів (для всіх / користувачів та групи) у поточному каталозі. Примітка . -executableОпція не працює на Mac, отже, вищезазначене рішення.
технофобар


1
@techfoobar: Питання неоднозначне: чи означає це файли, що містять виконуваний код, чи це означають файли, які мають дозвіл на виконання? Але навіть якщо ми припустимо, що дозвіл на виконання - це те, що хочеться (як здається, більшість відповідей), питання не говорить про виконання у світі . У вашому рішенні знайдуться файли (а також фіфоси, сокети, символьні посилання тощо), які мають дозвіл на виконання на весь світ, але не 750 ( -rwxr-x---), який все ще виконується для деяких користувачів.
G-Man

Відповіді:


157

Перевірка виконуваних файлів може здійснюватися за допомогою -perm(не рекомендується) або -executable(рекомендується, оскільки вона враховує ACL). Щоб скористатися -executableопцією:

find <dir> -executable

якщо ви хочете знайти лише виконувані файли, а не каталоги, які можна шукати, комбінуйте з -type f:

find <dir> -executable -type f

23
Шебанг не означає, що вони виконуються. він говорить нам лише, який перекладач використовувати. а за визначенням linux "виконувані файли" - це файли з набором виконуваного (х) біта
knittl

2
Яка версія пошуку підтримує цей тип для -type? людина знайде списки b, c, d, p, f, l, s та D у моїй системі.
innaM

2
Те саме, моєї знахідки теж немає -type x.
davr

7
Якщо у вас є стара версія пошуку (можливо, раніше 4.3.8), якій не вистачає знахідки використання. -perm / u = x, g = x, o = x.
Людвіг Вайнцерль

8
find: invalid predicate -executable'в RHEL
SSH Цього

33

Скористайтеся -permопцією знахідки . Це знайде файли в поточному каталозі, які виконуються або їх власником, членами групи або іншими особами:

find . -perm /u=x,g=x,o=x

Редагувати:

Щойно я знайшов ще один варіант, який є принаймні у GNU знайти 4.4.0:

find . -executable

Це має працювати ще краще, тому що ACL також розглядаються.


2
Це працює лише на більш новій версії знахідки. Той, який за замовчуванням приходить з CentOS, дає помилку find: invalid mode / u = x, g = x, o = x'`
davr

12
Потім слід спробувати версію "-perm +", яка тепер застаріла в GNU find: find. -perm +111 "
innaM

Схоже, це -perm /111може бути найбільш портативна версія.
Скотт

12

Я знаю, що питання конкретно згадує Linux, але оскільки це перший результат в Google, я просто хотів додати відповідь, яку я шукав (наприклад, якщо ви - як я в даний момент - змушений вашим роботодавцем використовувати не GNU / Система Linux).

Тестовано на macOS 10.12.5

find . -perm +111 -type f

1
Працює і в RHEL 5.
Хосе Томаш Точіно

Це єдиний варіант, з яким я міг би працювати над ОС X 10.14, thx
Джастін

3

У мене є інший підхід, якщо ви дійсно хочете просто зробити щось із виконуваними файлами - і не обов'язково насправді знаходити, щоб фільтрувати себе:

for i in `find -type f`; do [ -x $i ] && echo "$i is executable"; done

Я вважаю за краще це, оскільки він не покладається на те, -executableяка конкретна платформа; і це не покладається на те, -permщо є трохи затаємниченим, трохи конкретним платформою, і як написано вище, вимагає, щоб файл виконувався для всіх (не тільки для вас).

Це -type fважливо, тому що в * nix каталоги повинні бути виконані, щоб їх можна було перемістити, і чим більше запитів буде в findкоманді, тим ефективнішою буде ваша пам'ять.

Так чи інакше, пропонуючи ще один підхід, оскільки * nix - це країна мільярду підходів.


(0) Якому ви надаєте перевагу, таємницею та правильним чи інтуїтивним та хибним? Я вважаю за краще правильно. (1) відповідь  innaM , яка містить find -permфайли, знаходить файли, у яких встановлено будь-який біт дозволу на виконання. (2) Навпаки, ця відповідь знаходить лише ті файли, на які поточний користувач має дозвіл на виконання. Зрозуміло, це може бути те, чого хоче ОП, але це незрозуміло. … (Продовження)
Скотт

(Продовження)… (3) Для наочності ви можете змінити `…`на $(…)- побачити це , це та це . (4) Але не робіть for i in $(find …); do …; він не працює на імена файлів, які містять простір (и). Натомість зробіть find … -exec …. (5) І коли ви працюєте зі змінними оболонок, завжди цитуйте їх (у подвійних лапках), якщо у вас немає вагомих причин цього не робити, і ви впевнені, що знаєте, що робите.
Скотт

@scott Добре, я виправданий :) Я прочитав -permаргумент як вимагає всіх трьох, а не одного з них. Також дякую за вклад у захист аргументів оболонки, це все, про що я не знав.
Марк Маккенна

@MarkMcKenna у вас там помилка друку: for i in знайдіть. -типу f ; do [ -x $i ] && echo "$i is executable"; done; вам не вистачає частини <dir>, якою я користуюся крапкою (.)
Devy

2

Файл, позначений виконуваним файлом, не повинен бути виконуваним або завантажуваним файлом або об'єктом.

Ось що я використовую:

find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
    case "$(head -n 1 "$1")" in
      ?ELF*) exit 0;;
      MZ*) exit 0;;
      #!*/ocamlrun*)exit0;;
    esac
exit 1
' sh {} \; -print

2
Що це робить?
DerMike

@DerMike, Це один із способів знайти виконуваний файл у поточному каталозі, включаючи .so файли, навіть якщо файл не позначений виконуваним, він може виявити.
AjayKumarBasuthkar

Ну, я маю на увазі, як це робити?
DerMike

Він читається із заголовка файлу, щоб виявити, кожен двійковий файл або файл сценарію має заголовок.
AjayKumarBasuthkar

Наскільки я знаю, -name "*"це ніяк не впливає find- воно зазвичай знаходить усі файли, які не усуваються тестами.
G-Man

1

Як шанувальник одного вкладиша ...

find /usr/bin -executable -type f -print0 | xargs file | grep ASCII

Використовуючи 'xargs', щоб взяти висновок з команди find (використовуючи print0, щоб переконатися, що файли з пробілами правильно обробляються) Тепер у нас є список файлів, які можна виконати, і ми надаємо їх один за одним як параметр для команди "файл". Потім натисніть на термін ASCII, щоб ігнорувати двійкові файли. Будь ласка, замініть команду -executable in find стилем, який ви надаєте перевагу (див. Попередні відповіді) або що працює у вашій NIX OS

Мені потрібно було сказати вище, щоб знайти файли з eval у скриптах, що належать root, тому створив наступне, щоб допомогти знайти приватні слабкі місця ескалації, де користувач root виконує сценарії з небезпечними параметрами ...

echo -n "+ Identifying script files owned by root that execute and have an eval in them..."
find /  -not \( -path /proc -prune \)  -type f -executable -user root -exec grep -l eval {} \; -exec file {} \; | grep ASCII| cut -d ':' -f1 > $outputDir"/root_owned_scripts_with_eval.out" 2>/dev/null &

Це не спрацює, якщо сценарій містить символи, що не належать до ASCII. fileповідомляє про кодування, тому про сценарій python можна повідомити як a /usr/bin/python script, UTF-8 Unicode text executable. find ... | xargs file -b | grep -v '^ELF'може працювати краще, щоб визначити не бінарні файли.
ксеноїд

0

Я створив функцію ~/.bashrcсьогодні вночі, щоб знайти виконувані файли не в системному шляху, а не в каталогах:

# Quickly locate executables not in the path
xlocate () {
    locate -0r "$1" | xargs -0 -I{} bash -c '[[ -x "$1" ]] && [[ ! -d "$1" ]] \
        &&  echo "executable: $1"'  _  {}
} # xlocate ()

Перевага полягає в тому, що він буде шукати три дистрибутива Linux та інсталяцію Windows протягом секунди, де findкоманда займає 15 хвилин.

Наприклад:

$ time xlocate llocate
executable: /bin/ntfsfallocate
executable: /home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/bin/ntfsfallocate
executable: /mnt/clone/home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/usr/bin/fallocate
executable: /mnt/e/bin/llocate
executable: /mnt/old/bin/ntfsfallocate
executable: /mnt/old/usr/bin/fallocate
executable: /usr/bin/fallocate

real    0m0.504s
user    0m0.487s
sys     0m0.018s

Або для цілого каталогу та всього цього:

$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65

real    0m0.741s
user    0m0.705s
sys     0m0.032s
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.