Я випадково chmod -R + x в каталозі. Як відновити правильні дозволи?


20

Ну, якщо бути конкретним, то було chmod -R 755. Тепер кожен файл виконується, чого я не хочу. Я думаю, що я повинен переглянути перші два байти кожного файлу для #!, але чи охоплює це все? Чи варто замість цього використовувати fileдля того, щоб переглядати все і базувати на цьому своє рішення? Або, швидше за все, є ще кращий спосіб зробити це?

Що є кращим способом рекурсивно проходити через каталог і встановлювати -x на файли, які не повинні "виконуватися"?


Ви робили це в /іншому каталозі?
gvkv

1
@gvkv: Ні /, мені повністю належить каталог.
Ларрі Ван

1
@Larry в майбутньому ви, ймовірно, повинні використовувати якийсь варіант + x, а не зґвалтувати всі дозволи та, можливо, викликати записи у всіх файлах.
ксенотеррацид

@xenoterracide: Погоджено. Те, що я дуже хотів, - це дати тим самим дозволам групи, що і я (що в кінцевому підсумку трапилося!), Я просто не думав достатньо, перш ніж вводив текст.
Ларрі Ван

Про скільки файлів ми говоримо? Скільки має бути виконаним? Чи є спосіб сказати з імен файлів?
Девід Торнлі

Відповіді:


15

Тут немає ніякої чарівної кулі. Дозволи мають інформацію, яка не завжди є зайвою.

Якщо ви зробили це в системному каталозі, ваша система була б у дуже поганому стані, тому що вам доведеться турбуватися про встановлені і встановлені жорсткі біти, а також про файли, які не повинні бути читаними у всьому світі та про файли які повинні бути зареєстровані груповим або світовим.

У каталозі на кожного користувача ви повинні турбуватися про файли, які не повинні читатись у всьому світі. Там ніхто не може вам допомогти.

Що стосується виконуваності, то гарним правилом було б зробити так, щоб все, що не виглядало так, як воно могло бути виконане, було невиконаним. Ядро може виконувати скрипти, у яких перші два байти #!, бінарні файли ELF, перші чотири байти яких є \x7fELFде \x7fбайт зі значенням 12, та кілька рідкісних типів файлів (a.out, все, що зареєстровано у binfmt_misc). Отже, наступна команда повинна відновити ваші дозволи до розумного стану (передбачає bash 4 або zsh, в іншому випадку використовуйте findдля переходу до дерева каталогів; попередження, введене безпосередньо в браузер):

for x in **/*; do
  if ! [ -f "$x" ]; then continue; fi # skip all but regular files
  case $(head -c 4 "$x") in
    "#!"??) :;; # skip script
    "\x7fELF") :;; # skip ELF executable
    *) chmod a-x "$x";;
  esac
done

Зауважте, що існує простий спосіб резервного копіювання та відновлення дозволів дерева каталогів у Linux та, можливо, інших об'єднань із підтримкою ACL:

getfacl -R >saved-permissions
setfacl --restore=saved-permissions

Спасибі! На щастя, я думаю, що все підпадає під ці дві категорії. Якщо це щось не вистачає, я можу з цим розібратися пізніше.
Ларрі Ван

Майте на увазі, що **/*вимагає globstar.
Кріс Даун

Я рекомендую дві зміни цього сценарію. Один, findскоріше використовувати , ніж globstar; два, замість того, щоб дивитися на голову, скористайтеся fileкомандою, щоб побачити, що це таке, і звідти відгалуження.
Шадур

@Shadur findменш надійна , ніж globstar, globstarпереважно майже в кожному випадку.
Кріс Даун

1
@Gilles Переважно, як у "якщо у вас є, він набагато вищий", не тільки він швидший, але і більш надійний (і не має несподіваних SNAFU).
Кріс Даун

6

Я вірю, що вам захочеться чогось подібного

find dir -type f -exec chmod ugo-x '{}' +

Це шукає всі звичайні файли, рекурсивно в dir, (виключає каталоги та пристрої) та видаляє виконуваний біт.

Я б почав тут, а потім попрацював над тим, щоб зробити файли, які повинні бути виконаними, виконуваними.

Далі слід працювати саме так, як ви просили (він знайде всі звичайні файли, оберіть їх за #!, А потім видаліть х біт, якщо його не знайдено)

find . -type f | xargs grep -L #! | xargs chmod ugo-x

можливо краща версія вищевказаного (менше труб)

find . -type f -exec grep -L #! '{}' + | xargs chmod ugo-x 

3
Зробіть це grep -L '^#!'принаймні (лапки необхідні та ^обмежують відповідність на початку рядка), але це все ще занадто дозвільно, оскільки відповідає #!будь-якому рядку. Використання xargsне вдасться з іменами файлів, що містять пробіли або цитують символи; використання xargs -d '\n'(вимагає GNU xargs).
Жил "ТАК - перестань бути злим"

0

Ну, без рядка shebang, файл буде виконуватися як сценарій оболонки, номінально з /bin/sh . У вас ідея - це гарний початок, і за припущенням, що у відповідному каталозі відсутні критичні для місії файли, мабуть, не так багато ризику виконати деякі grepта chmodкомбіновані файли . Ви можете зіткнутися з помилковими позитивами, тобто файлами з рядком shebang, який не призначений для встановлення їх виконуваного біта, але не знаючи більше інформації про призначення того, що знаходиться в каталозі, тільки ви можете вирішити, чи є це істотною екзистенціальною загрозою для вашої система та / або дані.


Мене так хвилюють неправдиві позитиви, як хибні негативи. Є бінарні файли, з якими я не думаю починати #!.
Ларрі Ван
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.