Выстрел в небе: у Вас есть сценарий, который делает chmod-x на всех исполняемых файлах в системе, которая на самом деле не может быть выполнена (т.е. они по ошибке имеют x
флаг)?
(контекст:
После копирования файлов резервных копий от NTFS в ext4 файлы стали исполняемым файлом (HTML, md, txt, и т.д.). Я хотел бы сделать неисполняемый файл файлов, но только те, которые являются действительно неисполняемым файлом. Я должен буду, вероятно, записать сценарий, который выполняет итерации по всем файлам в системе (что-то как for f in ``find /path``; do intelligent_chmod -x $f; done;
, где intelligent_chmod
должен изучить файл и определить - ли это или ELF или имеет первую строку !#...
, и т.д.)
Это использует использование find
искать регулярные файлы, которые имеют исполняемый набор битов. Это затем тестирует их с file
команда, чтобы видеть, являются ли они действительно исполняемыми файлами или нет. В противном случае мы работаем chmod a-x
на них:
find . -type f -executable \( -exec sh -c 'file -b "$1" | grep -q executable' Test {} \; -o -exec chmod a-x {} \; \)
Как Вы видите, это find
команда имеет два -exec
выражения, которые соединены с ЛОГИЧЕСКОЙ ОПЕРАЦИЕЙ ИЛИ.
-type f -executable
Это говорит, находят, чтобы только искать регулярные файлы, которые имеют исполняемый набор битов.
\(
Это начинает группу.
По умолчанию, find
условия являются И-РЕДАКТОРОМ вместе и И связывает более трудный, чем ИЛИ. В этом случае мы хотим связать просто следующие два -exec
команды вместе с ИЛИ. Чтобы сделать это, нам нужна группа.
-exec sh -c 'file -b "$1" | grep -q executable' Test {} \;
Это имеет file
программа исследует каждый файл и grep
проверки, чтобы видеть, если строка executable
был в выводе file
команда.
В вышеупомянутом, Test
служит названием программы ($0
) для sh -c
сценарий. (Для обсуждения $0
и sh -c
, посмотрите этот вопрос.)
Вот некоторый демонстрационный вывод от file
команда:
$ file -b bash
ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=0e188133c8cc5187e22eabd27cbcf46f32060fe3, stripped
$ file -b which
POSIX shell script, ASCII text executable
Как видете, file
достаточно умно для идентификации как исполняемый файл не только файлы ELF, но также и большое разнообразие файлов сценария.
-o
Это логично - ИЛИ. Это означает, что команда, которая следует, будет только выполняться если file
не идентифицировал файл как исполняемый файл.
-exec chmod a-x {} \;
Это удаляет исполняемый бит.
\)
Это говорит find
то, что мы достигли конца сгруппированных команд.
Как описано в man magic
, программа file
работы путем исследования строк в файле. Много файлов имеют очень отличительные строки. Исполняемый файл ELF, например, начинается с шестнадцатеричных символов 7f 45 4c 46
. Jpeg и png графика имеют столь же отличные маркеры. file
не полностью анализирует или анализирует файл и, следовательно, для некоторых файлов, однако, волшебных сбоев. Поскольку Ayrat указывает в комментариях, file
неправильно истолковывает следующее:
$ cat tmp.py
Now is the time for all good men
to come to the aid of the party.
from xxx import yyy
$ file tmp.py
tmp.py: Python script, ASCII text executable