Как проверить исполняемый ли файл в linux

Обновлено: 06.07.2024

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как вентилятор одного лайнера .

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

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

Я не знаю, каково точное расширение исполняемого файла. Это .deb или .tar.gz ?

Не ответ, но я хотел бы добавить, что ВСЕ в LINUX - это ФАЙЛ, поэтому наличие расширений в виде .exe никогда не имеет значения. @tijybba Философия дизайна "все - это файл" совершенно не связана с .exe расширениями, которые не нужны для собственных исполняемых файлов. Первый объясняет содержание /dev ; последнее связано с разрешениями на выполнение и проверкой внутренней части файла, чтобы определить, какой это тип файла. @ Eliah Kagan - Это была просто базовая информация, так как в Windows расширение необходимо для выполнения, ну, в Linux это не так, что касается разрешений для исполняемых файлов , оно требует немного больше ноу-хау о доступе пользователя Sudo и проблем безопасности Underlaid , который, как я догадался, кто-то уточнит в ответе в качестве его последней части, если вообще понадобится, вот почему я разместил его как комментарий, а не как ответ. @tijybba Но «все», будучи файлом, не имеет ничего общего с темой этого вопроса, не так ли? Я полагаю, что я неправильно прочитал эту часть, в которой говорится «что такое exe- файл в Ubuntu?», Я подумал , что это исполняемый файл , но теперь с вашей нетерпеливой помощью кажется, что это означает «что такое exe- файл в Ubuntu?». Если это крайне неуместно, дайте мне знать, что я был бы рад удалить его (ошибки - большой опыт обучения: D).

В Windows нет стандартного File-Extention, подобного файлу ".exe".

В Linux практически любой файл может быть исполняемым. Окончание файла просто описывает (но не обязательно), что или как файл «исполняется».

Например, скрипт оболочки заканчивается на .sh и «выполняется» через оболочку bash.

В своем вопросе вы спрашиваете .deb и .tar.gz. Хорошо. Файл .deb устанавливает программное обеспечение в вашей системе (пожалуйста, будьте осторожны!), А файл .tar.gz представляет собой сжатый файл, такой как .zip, который вы могли бы узнать по Окна.

Файл .deb также больше похож на .zip, чем на .exe. Дело в том, что .deb не выполняется сам по себе , он извлекается, интерпретируется и устанавливается другим приложением. Это другое приложение, обычно являющееся Центром программного обеспечения, который также служит установщиком. Linux меньше зависит от расширений по сравнению с Windows и, следовательно, решает возможность выполнения на основе разрешений, а не расширений.

Я бы суммировал систему следующим образом:

Поэтому, ответьте на свой оригинальный вопрос, расширения нет, или редко, это .elf или .bin .

Это сделано вики-сообществом, поэтому любой может добавить запись.

Я никогда не видел расширение .elf, но видел расширение .bin довольно часто. В то время как другие ответы сосредоточены на том факте, что «любой» файл может быть исполняемым, этот ответ действительно бьет по голове, в то время как высказывание «все» может быть исполняемым, на самом деле не информативно и не правда, а скорее исключительно. Я мог бы переименовать любой файл в Windows в .exe, и он попытается выполнить его, но не обязательно будет работать, в Linux он такой же, если он не предназначен для выполнения, он не будет работать . Моя проблема много раз загружает пакет, и не совсем понимая, с чего начать, но, конечно, rtfm. Вы должны добавить расширение .bin (как Windows, эквивалентное .exe) Это не расширение, но для меня было полезно узнать, что формат "PE" в Windows эквивалентен формату "ELF" в Linux

Концепция исполняемого файла отличается в Unix / Linux от Windows.

Windows

Linux / Unix

Каждый файл имеет исполняемый бит, поэтому любой файл может быть выполнен, в отличие от Windows. Чтобы увидеть, является ли файл исполняемым, вы можете проверить его свойства (вкладка «Разрешения») или даже увидеть их помеченные в терминале (все они отмечены *).

Даже текстовые файлы (например, сценарии оболочки) могут иметь свои исполняемые биты и запускаться как единое целое.

Отдельные исполняемые биты существуют для пользователя, группы и других. Использование этих битов может ограничить, кто может выполнять программу. Существуют дополнительные биты для SUID и SGID, чтобы заставить программу работать от имени пользователя или группы, которой принадлежит файл. Выше приведены некоторые неточности: 2) «у каждого файла есть исполняемый бит»: есть три исполняемых бита (владелец, группа и другие), поэтому один может разрешить выполнение файла самому себе, но не другим. Также есть бит setuid для «execute-as-owner» и setgid «execute-as-group». 2) «любой файл может быть выполнен»: не так. биты разрешения являются обязательным, но недостаточным условием для успешного выполнения файла. Немедленный сбой произойдет, например, если файл на самом деле не может быть загружен и запущен (Ссылка: магические числа файлов man magic , ELF man elf и строка хэш-бэнг man execve )

Чтобы узнать, что операционная система UNIX думает о типе конкретного файла, вы используете команду file:

В приведенном выше примере я указываю путь к программе 'ls', вы должны заменить путь к вашему файлу.

Файл сценария будет выглядеть так:

Случайный текстовый файл:

Он даже достаточно умен, чтобы правильно идентифицировать программу Windows, если у вас есть одна, лежащая на вашем компьютере с UNIX:

И когда он не может понять, что это за файл (но может открыть его), он называет это данными:

Выполнение файла в Linux вообще не связано с именем файла или расширением. Любой файл может быть потенциально выполнен при условии, что он обрабатывается binfmt механизмом ядра (и что для него установлены разрешения на выполнение).

Наиболее распространенным форматом для исполняемого файла является ELF , хотя некоторые ядра могут быть скомпилированы для поддержки старого a.out формата. (Для получения полной технической информации, binfmt_elf.c это где искать.)

binfmt_misc позволяет для регистрации других обработчиков, как описано здесь .

Если вам нравится заниматься программированием ядра, вы даже можете написать свой собственный .

Хотя это и не связано напрямую, file команда должна указать вам, является ли файл исполняемым файлом ELF или чем-то еще.

Другой аспект, который может возникнуть, когда вы хотите «запустить» файл, - это иметь инструмент проводника, который использует расширения регистра, чтобы иметь возможность запустить программу, которая откроет эти файлы. Это то, что произойдет, если вы дважды щелкнете по a .txt , .tar.gz или .deb , например: файлы не являются ни исполняемыми, ни исполняемыми, но то, что вы используете для двойного щелчка, выбирает, какой исполняемый файл нужно открыть, чтобы открыть эти файлы.

@ObsessiveFOSS, но заслуживает ли он снижения? Никто не упомянул моно до моего ответа. Никакой ответ здесь действительно не говорит о том, как на самом деле работают исполняемые файлы Linux (см. Мой комментарий о binfmt в отношении принятого ответа). Я не понизил. Я чувствовал, что голосование должно остаться как есть. @ObsessiveFOSS, нет проблем. Я также заметил, что вопрос был отредактирован с тех пор, как я на него ответил, немного изменив его значение (изначально я понимал его как «У меня есть исполняемый файл, я не могу его запустить . ») и уменьшил свой ответ актуально действительно.

В Windows .exe-файл - это компьютерный файл, который заканчивается расширением «.exe», которое обычно называют исполняемым файлом. Когда вы нажимаете exe-файл, встроенная подпрограмма автоматически выполняет код, который может привести в движение несколько функций. EXE-файлы обычно используются для установки файлов в операционной системе Windows.

Кроме того, у вас есть файлы .tar, обычно известные как сжатые файлы. В версиях Linux, таких как Ubuntu, функции используются в различных дистрибутивах программного обеспечения, причем большая часть исходного кода программного обеспечения доступна в формате tar.gz. Из этого можно предположить, что tar. gz - это форма хорошо известного формата .tar, который используется для архивирования.

В Ubuntu, с другой стороны, формат файла .deb больше похож на файл .exe в windows. Когда вы открываете его, центр программного обеспечения обрабатывает его код и устанавливает содержащуюся в нем программу, такую ​​как исполняемый файл.

Даже если вы по-прежнему можете устанавливать программное обеспечение и пакеты из исходного формата (tar.gz), наиболее подходящим форматом для установки программного обеспечения является .deb. Возьмем, к примеру, Ubuntu Software Center; все приложения, которые он содержит, на самом деле являются файлами .deb. В целом, в linux почти каждый формат файла (включая .deb и tar.gz, а также хорошо известные файлы bash .sh) может вести себя как исполняемый файл, так что вы можете установить пакеты или программное обеспечение с этим.

Я бы лучше сравнил файлы .deb в системах, производных от Debian, с файлами MSI для установщика Microsoft .

В Windows нет эквивалента расширению exe, указывающему на то, что файл является исполняемым. Вместо этого исполняемые файлы могут иметь любое расширение и, как правило, вообще не иметь расширения .

Linux / Unix использует права доступа к файлам , чтобы указать , если файл может быть выполнен. В частности, есть разрешение на выполнение файла, которое сообщает системе, что этот файл разрешено выполнять. Однако отсутствие этого разрешения не означает, что файл не является исполняемым; просто, что соответствующий пользователь не имеет права пытаться выполнить его. Точно так же наличие этого разрешения не всегда указывает на то, что файл является допустимым исполняемым файлом.

Linux / Unix имеет двоичный формат исполняемых файлов, называемый ELF, который эквивалентен двоичным исполняемым форматам PE (Windows) или MZ / NE (DOS), которые обычно имеют расширение .exe.

Тем не менее, другие типы файлов могут быть исполняемыми, в зависимости от оболочки. Как правило, если вы пытаетесь выполнить файл, который система не распознает как двоичный исполняемый файл (например, формат ELF), то он интерпретируется текущим интерпретатором оболочки. Это выполняет тот же эффект, что и пакетные файлы в Windows или DOS, за исключением того, что опять-таки это не расширение, которое определяет его тип или способ его выполнения.

Ух, я тоже почти ответил на это. Посмотрите на дату, этот пост является динозавром.

Файлы EXE и DLL являются переносимыми исполняемыми файлами. Они основаны на Unix-файлах PE / COFF.

В Ubuntu у вас нет определенного расширения для исполняемого файла. Обычно это файлы, которые названы в честь приложения, к которому они относятся.

Важным фактором является то, что в этих файлах установлен исполняемый бит. Если у вас есть цветной терминал, вы заметите, что это другой цвет при использовании ls .

В файловой системе Unix бинарные исполняемые файлы обычно хранятся в собственном месте.

  1. / bin (основные двоичные файлы)
  2. / sbin (системные двоичные файлы)
  3. / usr / bin (двоичные файлы приложения)

тогда как другие ресурсы приложения могут храниться в / usr / lib / или / usr / share /

Файл deb более корректно соответствует файлу msi в windows (то есть установщику пакета).

Если вы знаете путь к командному файлу, используйте оператор if -x / path / to / command. Если для команды установлено разрешение на выполнение (x), то она является исполняемой.

Как узнать, является ли файл исполняемым?

использование Os. доступ() чтобы проверить, является ли файл исполняемым

Установите разрешения на 0o777, чтобы предоставить файлу права на чтение, запись и выполнение. Позвоните в os. доступ (имя файла, флаг) с флагом как os. X_OK, чтобы проверить, является ли имя файла исполняемым.

Какой файл исполняемый в Linux?

файлы deb. В общем, в Linux почти каждый формат файла (включая .deb и tar. Gz, а также хорошо известные файлы bash. Sh) может вести себя как исполняемый файл, так что вы можете устанавливать пакеты или программное обеспечение с ним.

Какой вариант проверить, существует ли файл и является ли он исполняемым?

При проверке существования файла наиболее часто используются файловые операторы. -e и -f. Параметр '-e' используется для проверки, существует ли файл независимо от типа, в то время как параметр «-f» используется для возврата истинного значения только в том случае, если файл является обычным файлом (не каталогом или устройством).

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

Сначала откройте Терминал, затем отметьте файл как исполняемый с помощью команды chmod.

Это исполняемый файл?

Исполняемый файл (exe-файл) - это компьютерный файл, содержащий закодированную последовательность инструкций, которые система может выполнить напрямую когда пользователь щелкает значок файла. Исполняемые файлы обычно имеют расширение EXE, но существуют сотни других форматов исполняемых файлов.

Python - исполняемый файл?

Чтобы проверить, является ли существующий файл исполняемым, используйте Os. доступ (путь, режим), с помощью os. Режим X_OK. Значение, которое нужно включить в параметр режима access (), чтобы определить, можно ли выполнить путь.

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

Сохраните файл как hello.sh (.sh - это просто соглашение, это может быть любое имя файла). потом запустить chmod + x hello.sh и вы сможете запустить этот файл как исполняемый файл. Переместите этот файл в / usr / local / bin, и вы сможете запустить hello.sh из командной строки, и он должен выполнить вашу программу.

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

  1. Создайте в домашнем каталоге папку с именем bin. …
  2. Добавьте

Мне интересно, что самый простой способ проверить, является ли программа исполняемой с помощью bash, без ее выполнения? Он должен по крайней мере проверить, имеет ли файл права выполнения и имеет одну и ту же архитектуру (например, не исполняемый файл Windows или другую неподдерживаемую архитектуру, а не 64 бита, если система 32 бита. ) в качестве текущей системы.

ОТВЕТЫ

Ответ 1

Взгляните на различные операторы test (это для самой тестовой команды, но встроенные тесты BASH и TCSH больше или менее того же).

Вы заметите, что -x FILE говорит, что ФАЙЛ существует, и предоставляется разрешение на выполнение (или поиск).

BASH, Bourne, Ksh, Zsh Script

TCSH или CSH Script:

Чтобы определить тип файла, попробуйте file. Вы можете разобрать вывод, чтобы посмотреть, какой тип файла он имеет. Word 'o Предупреждение: Иногда file возвращает более одной строки. Вот что происходит на моем Mac:

Команда file возвращает разные выходные данные в зависимости от ОС. Однако слово executable будет в исполняемых программах, и обычно архитектура тоже появится.

Сравните приведенное выше с тем, что я получаю в своем ящике Linux:

Во всех трех случаях вы увидите слово executable и архитектуру ( x86-64 , i386 или SPARC с помощью 32-bit ).

Большое спасибо, это похоже на путь. Прежде чем отметить это как свой ответ, можете ли вы рассказать мне о том, какую проверку оболочки script мне нужно выполнить (например, какой синтаксический анализ) на "файл", чтобы проверить, могу ли я выполнить программу? Если такой тест слишком сложно сделать на общем основании, я бы хотя бы хотел проверить, является ли он исполняемым linux или osX (Mach-O)

Сверху моей головы вы можете сделать что-то вроде этого в BASH:

В принципе, я запускаю тест, а затем, если это успешно, я делаю grep на выходе команды file . grep -q означает, что печать не выводится, но используйте код выхода grep, чтобы узнать, нашел ли я строку. Если ваша система не принимает grep -q , вы можете попробовать grep "regex" > /dev/null 2>&1 .

Опять же, вывод команды file может отличаться от системы к системе, поэтому вам нужно будет убедиться, что они будут работать в вашей системе. Кроме того, я проверяю исполняемый бит. Если файл является двоичным исполняемым файлом, но исполняемый бит не включен, я скажу, что он не является исполняемым. Возможно, это не то, что вы хотите.

Ответ 2

Кажется, никто не заметил, что оператор -x не отличается файлом с каталогом.

Чтобы точно проверить исполняемый файл, вы можете использовать [[ -f SomeFile && -x SomeFile ]]

Ответ 3

Также кажется, что никто не заметил -x оператора на символических ссылках. Символьная ссылка (цепочка) на обычный файл (не классифицируется как исполняемый файл) не проходит тест.

Ответ 4

Тестирование файлов, каталогов и символических ссылок

Решения, приведенные здесь, не работают ни на каталогах, ни на символических ссылках (или на обоих). В Linux вы можете тестировать файлы, каталоги и символические ссылки с помощью:

В OS X вы должны быть в состоянии установить coreutils вместе с homebrew и использовать grealpath .

Читайте также: