Як рекурсивно видаляти дозволи на виконання файлів з файлів, не торкаючись папок?


40

Я зробив резервну копію на накопичувачі NTFS, і ну, ця резервна копія справді виявилася необхідною. Однак накопичувач NTFS зіпсував дозволи. Я хотів би відновити їх до нормального без ручного виправлення кожного файлу.

Одна з проблем полягає в тому, що раптом усі мої текстові файли отримали дозволи на виконання, що неправильно ofc. Тому я спробував:

sudo chmod -R a-x folder\ with\ restored\ backup/

Але це неправильно, оскільки видаляє xдозвіл з каталогів, що робить їх нечитабельними.

Яка в цьому випадку правильна команда?


1
Мета: Я ніколи не розумів, чому системи Unix додають біт виконання файлам, встановленим з файлових систем DOS або Windows. Це не так, як ніхто не збирається виконувати ці файли. Як правило, я додаю "noexec" до моїх варіантів монтажу, де це можливо.
Едвард Фолк

Відповіді:


68
chmod -R -x+X *

В -xвидаляє права на виконання для всіх додасть права на виконання для всіх, але тільки для каталогів.
+X


2
Команда, яку я врешті використовував для відновлення дозволів до нормальних: `chmod -R a-x + X, u-x + rwX, go / wx + rX каталог / ім'я`
gaazkam

3
Також дивіться відповідь Едварда про виняток для BSD
fikr4n

4
Це не відповідає вимозі "без торкання папок". Що робити, якщо Execute (можливо, для світу) був навмисно видалений у деяких каталогах? Не слід додавати його.
Бен Фойт

4
це не спрацювало на Mac. Якщо перемістити прапор -R до початку, це призведе до роботи як в терміналах Linux, так і в Mac. chmod -R -x+x *
JoeMoe1984

2
Насправді з правильним порядком він працює на OSX, але насправді він не має бажаного ефекту. Ви повинні зробити це як два окремі етапи:chmod -R -x * && chmod -R +X *
Timmmm

14

Гаразд, я перечитав підручні сторінки "chmod" для Mac OS X, BSD та Linux і зробив кілька експериментів. Ось що я дізнався про символічні режими. Це може ускладнитися, але це варто зрозуміти:

  • Загальною формою є пункт [, пункт ...] де:
  • пункт : = [ugoa] [+ - =] [rwxXstugo]
  • [ugoa] ( хто ) (вказати кілька) означає встановити дозвіл для користувача, групи, інших або всіх. Якщо не вказано, за замовчуванням є "a", але umask діє.
  • [+ - =] ( дія ) (вказати одну) означає:
    • + означає додати вказані дозволи до вже наявних дозволів
    • - означає видалити вказані дозволи з уже наявних дозволів
    • = означає встановити дозволи на вказані дозволи, очистивши всі інші
  • [rwxXstugo] ( дозвіл ) (вкажіть кілька rwxXst АБО один з ugo) встановлює дозволи для вказаних користувачів (-ів) таким чином:
    • r - читати
    • w - пишіть
    • x - виконання / пошук
    • X - каталог виконувати / шукати iff АБО будь-який біт виконання вже встановлений.
    • s - суїд або жорсткий
    • т - липкий
    • u - копіювати дозвіл користувача
    • g - копія дозволу групи
    • o - скопіюйте інший дозвіл

Так, наприклад, a+xзробить файл виконуваним усіма. a+Xзробить файл виконуваним усіма, якби його хтось виконав.

a+xзробить пошук у каталозі всім. a+Xтакож зробив би пошук у каталозі всім.

Ключова відмінність BSD від Linux полягає в тому, що для BSD визначення визначається на основі дозволів файлу до виконання chmod. Незважаючи на те, що з Linux, визначення здійснюється безпосередньо перед виконанням пункту + X.

Таким чином, з BSD, комбінація a-x,a+Xвидалить дозвіл на виконання / пошук, а потім зробить каталог, який можна шукати всім, і зробить файл, який виконується всіма, якщо його спочатку хтось виконував.

За допомогою Linux a-x,a+Xвидалить дозвіл на виконання / пошук, а потім зробить каталог, який можна шукати всім, залишаючи файл виконуваним ніхто.


Ось конкретний приклад: на BSD-машині: каталог, виконуваний файл та невиконаний файл:

drwxr-x---  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x---  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

Зауважте, що і каталог, і "fie" користувач може виконувати / шукати, а не інші.

Тепер ми виконуємо chmod a-x,a+X *. Перший пункт позбавить біт виконання / пошуку для всіх користувачів усіх файлів, але другий додаток додасть його як для "комісії", так і для "фіе". "гонорар", тому що це каталог, і "fie", оскільки він мав принаймні один виконуваний біт для початку.

drwxr-x--x  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x--x  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

У мене був такий самий результат виконання chmod -x+X.

Висновок: рішення Jak Gibb буде працювати на Linux, але для BSD вам потрібно зробити два проходи.

Я не тестував це на SVr4 або інших варіантах Unix.


Приємно читати. Дякуємо, що провели дослідження з цього питання.
Jak Gibb

10

Один із способів зробити це:

find backup -type f -exec chmod 0644 {} +

6
Це може завершити додавання або видалення дозволів, які ви не хотіли змінювати. Краще використовуватиchmod a-x {}
Едвард Фолк

1
@EdwardFalk chmod a-x {}може також в кінцевому підсумку видалення дозволів ви не хочете , щоб зміни, і це може залишити файли світового запис. Справа в тому, що 0644 - це "взагалі розумний" компроміс. Звісно, ​​ОП повинен також залучати мозок, перш ніж застосовувати рішення з Інтернету на своєму комп’ютері.
Satō Katsura

4
"ax" видаляє дозвіл на виконання користувача, групи, інших та залишає інші дозволи без змін, наскільки я знаю. У мене це неправильно?
Едвард Фолк

1
@EdwardFalk Ні, ти маєш рацію. Але ви не знаєте, що насправді є набором файлів, і ви також не знаєте, що таке дозволи раніше chmod. Якщо файли резервного копіювання містять сценарії та бінарні файли, видалення xз них неправильне. Якщо дозволу раніше chmodє 0777, тоді chmod a-xвони все одно залишать їх 0666, що, мабуть, не те, що ви хочете. Що я говорю, chmod 0644це краща евристика, а не chmod a-xнеправильна.
Satō Katsura

1
@NajibIdrissi За винятком випадків, коли вони змінилися на 0777, коли ви скопіювали їх у іноземну файлову систему, яка не має дозволів UNIX. Саме це і зробила ОП.
Satō Katsura

6
 find backup ! -type l ! -type d -exec chmod a-x {} +

Буде видалено дозвіл на виконання файлів, що не мають типового каталогу (як ви просили), ані символічного посилання (символьні посилання, як правило, завжди rwxrwxrwx, і chmodвпливатимуть на ціль символьної посилання на них).

Зауважте, що:

 find backup -type f -exec chmod a-x {} +

змінив би лише дозвіл звичайних файлів. Це виключало б каталоги та символьні посилання , але також пристрої , названі трубами , розетками та, можливо, іншими, залежно від системи (хоча у випадку з ОП резервне копіювання файлової системи NTFS, вони навряд чи будуть наявними).


2

У zsh використовуйте глобальний класифікатор, . щоб порівнювати лише звичайні файли (не включаючи символьні посилання) та Dвідповідати крапковим файлам:

sudo chmod a-x folder\ with\ restored\ backup/**/*(D.)

Якщо командний рядок занадто довгий, ви можете використовувати zargs:

zargs -- folder\ with\ restored\ backup/**/*(D.) -- sudo chmod a-x 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.