Ну, чтобы быть конкретным, это было chmod -R 755
. Теперь каждый файл исполняемый, чего я не хочу. Я думаю, что я должен смотреть на первые два байта каждого файла для #!
, но охватит ли это все? Должен ли я вместо этого использовать, file
чтобы посмотреть на все и основывать свое решение на этом? Или, более вероятно, есть еще лучший способ сделать это?
Каков предпочтительный способ рекурсивного просмотра каталога и установки -x для файлов, которые «не должны быть» исполняемыми?
permissions
files
chmod
Ларри Ван
источник
источник
/
или другом каталоге?/
, каталог полностью принадлежит мне.Ответы:
Здесь нет волшебной пули. Разрешения несут информацию, которая не всегда избыточна.
Если бы вы сделали это в системном каталоге, ваша система была бы в очень плохом состоянии, потому что вам пришлось бы беспокоиться о битах setuid и setgid, а также о файлах, которые не должны быть доступны для чтения всем пользователям, и о файлах. которые должны быть написаны группой или миром.
В каталоге для каждого пользователя вам нужно беспокоиться о файлах, которые не должны быть доступны для чтения всем пользователям. Там никто не сможет тебе помочь.
Что касается выполнимости, хорошее эмпирическое правило состояло бы в том, чтобы сделать все, что не похоже на его выполнение, неисполнимым. Ядро может выполнять сценарии с первыми двумя байтами
#!
, двоичные файлы ELF, первые четыре байта\x7fELF
которых\x7f
- это где байт со значением 12, и несколько более редких типов файлов (a.out, все, что зарегистрировано вbinfmt_misc
). Следовательно, следующая команда должна восстановить ваши разрешения до приемлемого состояния (предполагается, что bash 4 или zsh, в противном случае используйтеfind
для просмотра дерева каталогов; предупреждение, введенное непосредственно в браузере):Обратите внимание, что существует простой способ резервного копирования и восстановления разрешений дерева каталогов в Linux и, возможно, в других устройствах с поддержкой ACL:
источник
**/*
требуетglobstar
.find
Во- первых, используйте, а не Globstar; два, вместо того, чтобы смотреть на голову, используйтеfile
команду, чтобы увидеть, что это такое, и оттуда ответвляться.find
менее надеженglobstar
,globstar
предпочтителен почти в каждом случае.Я верю, что вы захотите что-то вроде
find dir -type f -exec chmod ugo-x '{}' +
Это ищет все обычные файлы, рекурсивно в dir (исключая каталоги и устройства) и удаляет исполняемый бит.
Я бы начал здесь, а затем продолжил свой путь к созданию файлов, которые должны быть исполняемыми, исполняемыми.
Следующее должно работать точно так, как вы просили (он найдет все обычные файлы, grep их для #! И затем удалит биты x, если не найден)
возможно, лучшая версия выше (меньше труб)
источник
grep -L '^#!'
по крайней мере (кавычки необходимы и^
ограничиваются соответствием в начале строки), но это все еще слишком разрешительно, поскольку оно соответствует#!
любой строке. Использование неxargs
будет работать с именами файлов, содержащими пробелы или символы кавычек; использоватьxargs -d '\n'
(требуется GNUxargs
).Ну, без строки shebang, файл будет выполнен как скрипт оболочки, номинально с
/bin/sh
. Вы считаете, что это хорошее начало, и при условии, что рассматриваемый каталог не содержит критически важных файлов, вероятно, нет большого риска для выполнения некоторыхgrep
иchmod
комбинированных. Вы можете столкнуться с ложными срабатываниями, т. Е. С файлами со строкой Шебанга, для которых не предназначен набор исполняемых битов, но без знания дополнительной информации о назначении каталога, только вы можете решить, представляет ли это существенную экзистенциальную угрозу вашему система и / или данные.источник
#!
.