Вопрос: Как найти только исполняемые файлы в определенном каталоге в Linux?


Как найти только исполняемые файлы в определенном каталоге в Linux?


122
2017-09-10 11:56


Источник


Вот своего рода сценарий BASH, это не так плохо, что я могу сказать :) stackoverflow.com/a/20209457/2067125 - AjayKumarBasuthkar
Как насчет использования стандарта file команда? - Breakthrough
Для тех, кто хочет сделать это на макинтош (проверено на OS X 10.9.5): ls -l | egrep '^[^d]..x..x..x.*$'  В приведенном выше списке будут перечислены все исполняемые файлы (для всех / пользователей и групп) в текущем каталоге. Заметка: -executable вариант не работает на Mac, следовательно, это обходное решение. - techfoobar
Также актуально: Unix find: поиск исполняемых файлов - Slothworks
@techfoobar: Вопрос неоднозначен: означает ли это файлы, содержащие исполняемый код, или это значит, что файлы имеют разрешение на выполнение? Но даже если мы предположим, что исполняемое разрешение - это то, что нужно (как кажется большинству ответов), вопрос не говорит мирового исполняемым, Ваше решение найдет файлы (а также fifos, сокеты, символические ссылки и т. Д.), Которые имеют разрешение на выполнение всего мира, но не 750 (-rwxr-x---), который по-прежнему является исполняемым для некоторых пользователей. - G-Man


Ответы:


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

find <dir> -executable

если вы хотите найти только исполняемые файлы, а не каталоги, доступные для поиска, -type f:

find <dir> -executable -type f

123
2017-09-10 11:59



shebang не означает, что они исполняемы. это говорит нам только о том, какой интерпретатор использовать. и по определению linux «исполняемые файлы» - это файлы с установленным битом исполняемого файла (x) - knittl
Какая версия find поддерживает этот тип для -type? человек набирает в моей системе списки b, c, d, p, f, l, s и D. - innaM
То же самое, моя находка не имеет -type x или. - davr
Если у вас есть старая версия find (возможно, до 4.3.8), которой не хватает -executable use find. -perm / u = x, g = x, o = x. - Ludwig Weinzierl
find: invalid predicate -executable' на RHEL - SSH This


Используйте -perm вариант. Это найдет файлы в текущем каталоге, которые либо исполняются их владельцем, либо членами группы, либо другими:

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

Редактировать:

Я просто нашел еще один вариант, который присутствует, по крайней мере, в GNU find 4.4.0:

find . -executable

Это должно работать еще лучше, потому что ACL также рассматриваются.


26
2017-09-10 15:55



Это работает только в более новой версии поиска. Тот, который поставляется по умолчанию с CentOS, дает ошибку find: invalid mode / и = х, г = х, о = x'` - davr
Затем вы должны попробовать версию «-perm +», которая теперь устарела в GNU find: find. -перм +111 " - innaM
Похоже на -perm /111 может быть самой переносимой версией. - Scott


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

Протестировано Macos 10.12.5

find . -perm +111 -type f

4
2018-06-01 06:59



Работает и в RHEL 5. - José Tomás Tocino


У меня есть другой подход, в случае, если вы действительно хотите только что сделать что-то с исполняемыми файлами - и не обязательно, чтобы заставить заставить фильтр фильтровать себя:

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

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

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

Во всяком случае, просто предлагая другой подход, так как * nix - это земля в миллиард подходов.


3
2018-04-24 02:38



(0) Что вы предпочитаете, тайные и правильные или интуитивные и ошибочные? Я предпочитаю правильно. (1)Ответ innaM, с участием find -perm, находит файлы, которые Любые выполнить бит бит разрешения. (2) В отличие от этого ответа найдены только файлы, для которых текущий пользователь имеет разрешение на выполнение. Конечно, это может быть то, чего хочет OP, но это неясно. ... (Продолжение) - Scott
(Продолжение) ... (3) Для ясности вы можете изменить `…` в $(…) - видеть это, это, а также это, (4) Но не надо for i in $(find …); do …; он терпит неудачу при именах файлов, содержащих пробелы. Вместо этого find … -exec …, (5) И когда вы работаете с переменными оболочки, всегда цитируйте их (в двойных кавычках), если у вас нет веских оснований, и вы уверены, что знаете, что делаете. - Scott
@scott ОК, я стою исправлено :) Я прочитал -perm аргумент, требующий всех трех, а не один из них. Кроме того, спасибо за вклад в защиту аргументов оболочки, это все, о чем я не знал. - Mark McKenna
@MarkMcKenna у вас есть опечатка: for i in найти . Тип f; do [ -x $i ] && echo "$i is executable"; done; вам не хватает части <dir>, в которой я использую точку (.) - Devy


Файл, помеченный как исполняемый файл, не обязательно должен быть исполняемым или загружаемым файлом или объектом.

Вот что я использую:

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
2018-03-26 07:52



Что это делает? - DerMike
@DerMike. Это один из способов найти исполняемый файл в текущем каталоге, включая файлы .so, даже если файл не помечен как исполняемый файл, который он может обнаружить. - AjayKumarBasuthkar
Ну, я имею в виду, как это делает это? - DerMike
Он читает из заголовка файла для обнаружения, каждый файл двоичного файла или файл сценария имеет заголовок. - AjayKumarBasuthkar
Насколько я знаю, -name "*" не влияет на find - он обычно находит все файлы, которые не устраняются с помощью тестов. - G-Man


Как поклонник одного лайнера ...

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

Использование «xargs» для вывода результата из команды find (с помощью print0 для обеспечения правильной обработки имен файлов с пробелами). Теперь у нас есть список исполняемых файлов, и мы предоставляем их один за другим в качестве параметра для команды «файл». Затем grep для выражения ASCII для игнорирования двоичных файлов. Подставьте -executable в команде find с каким стилем вы предпочитаете (см. Более ранние ответы) или тем, что работает на вашей «ОС NIX»

Я потребовал, чтобы выше, чтобы найти файлы с 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 &

1
2017-07-09 12:31



Это не сработает, если скрипт содержит символы, отличные от ASCII. fileсообщает о кодировании, поэтому скрипт python можно сообщить как a /usr/bin/python script, UTF-8 Unicode text executable, find ... | xargs file -b | grep -v '^ELF' может работать лучше, чтобы определить не-двоичные файлы. - xenoid