Интеллектуальный chmod-x для всех исполняемых файлов, которые на самом деле не могут быть выполнены

Выстрел в небе: у Вас есть сценарий, который делает chmod-x на всех исполняемых файлах в системе, которая на самом деле не может быть выполнена (т.е. они по ошибке имеют x флаг)?

(контекст:
После копирования файлов резервных копий от NTFS в ext4 файлы стали исполняемым файлом (HTML, md, txt, и т.д.). Я хотел бы сделать неисполняемый файл файлов, но только те, которые являются действительно неисполняемым файлом. Я должен буду, вероятно, записать сценарий, который выполняет итерации по всем файлам в системе (что-то как for f in ``find /path``; do intelligent_chmod -x $f; done;, где intelligent_chmod должен изучить файл и определить - ли это или ELF или имеет первую строку !#..., и т.д.)

4
задан 10 August 2016 в 10:33

1 ответ

Это использует использование 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
10
ответ дан 1 December 2019 в 08:59

Другие вопросы по тегам:

Похожие вопросы: