Как найти только исполняемые файлы под определенным каталогом в Linux?
Как найти только исполняемые файлы под определенным каталогом в Linux?
Как найти только исполняемые файлы под определенным каталогом в Linux?
Проверка на наличие исполняемых файлов может быть выполнена с помощью -perm
(не рекомендуется) или -executable
(рекомендуется, т.к. учитывается ACL). Чтобы использовать -executable
:
find <dir> -executable
, если вы хотите найти только исполняемые файлы, а не каталоги с возможностью поиска, комбинируйте с -type f
:
find <dir> -executable -type f
```.
Используйте опцию find’s -perm
. В текущем каталоге будут найдены файлы, которые исполняются либо их владельцем, либо членами группы, либо другими:
find . -perm /u=x,g=x,o=x
Edit:
Я только что нашел еще одну опцию, которая присутствует, по крайней мере, в GNU find 4.4.0:
find . -executable
Это должно работать еще лучше, потому что ACL тоже рассматриваются.
Я знаю, что в вопросе конкретно упоминается Linux, но поскольку это первый результат в Google, я просто хотел добавить ответ, который я искал (например, если вы - как и я в данный момент - вынуждены использовать не GNU/Linux).
Протестировано на macOS 10.12.5
find . -perm +111 -type f
У меня есть другой подход, в случае, если вы действительно хотите просто сделать что-то с исполняемыми файлами - и не обязательно заставлять найти фильтровать себя:
for i in `find -type f`; do [-x $i] && echo "$i is executable"; done
Я предпочитаю это, потому что он не полагается на -executable
, которая специфична для платформы; и он не полагается на -perm
, которая немного загадочна, немного специфична для платформы, и, как написано выше, требует, чтобы файл был исполняемым для всех (не только для вас).
-type f
важен, потому что в каталогах *nix должен быть исполняемый файл, чтобы его можно было обойти, и чем больше запросов находится в команде find
, тем более эффективной будет память вашей команды.
Как бы то ни было, просто предлагаем другой подход, так как *nix - это страна миллиардных подходов.
Файл, помеченный как исполняемый, не обязательно должен быть исполняемым или загружаемым файлом или объектом.
Вот что я использую:
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
Как поклонник одного вкладыша…
find /usr/bin -executable -type f -print0 | xargs file | grep ASCII
Использование ‘xargs’ для получения вывода из команды поиска (использование print0 для обеспечения корректной работы с именами файлов с пробелами). Теперь у нас есть список исполняемых файлов, и мы предоставляем их по одному в качестве параметра для команды ‘file’. Затем grep для термина ASCII, чтобы игнорировать двоичные файлы. Пожалуйста, замените -executable in find command на то, какой стиль вы предпочитаете (см. предыдущие ответы), или на то, что работает на вашей ‘NIX OS
Мне нужно было, чтобы найти файлы с оценкой в скриптах, принадлежащих 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 &
```, создайте следующую команду
Сегодня вечером я создал функцию в ~/.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