Потрібно виправити права доступу до файлів у домашній каталог користувача


24

Хтось має інструмент або скрипт, який буде рекурсивно виправляти дозволи файлів у каталозі?

На машині Ubuntu Linux купу файлів було скопійовано на USB-диск з повним дозволом 777 (користувач, група, інші - читати, писати, виконувати) помилково. Я хочу повернути їх у виправлений каталог користувача.

Довідників має бути 775, а всіх інших файлів може бути 664. Усі файли - це зображення, документи або MP3, тому жоден з них не повинен бути виконаним. Якщо біт каталогів встановлений, він потребує виконання, іншим чином він просто потребує користувача та групи, читати та писати.

Я подумав, що варто перевірити, чи існує така утиліта, перш ніж зламати сценарій оболонки :)


Відповіді:


51

Для цього слід зробити фокус:

find /home/user -type d -print0 | xargs -0 chmod 0775
find /home/user -type f -print0 | xargs -0 chmod 0664

1
+1 для використання -print0 / xargs -0 :-).
sleske

14

знайти може зробити трюк самостійно з -exec:

find /home/user -type f -exec chmod 0664 {} \;
find /home/user -type d -exec chmod 0775 {} \;

щоб запобігти появі нересту chmod для кожного запису:

find /home/user -type f -exec chmod 0664 {} +
find /home/user -type d -exec chmod 0775 {} +

(це ефективно викликає chmod один раз зі списком усіх файлів як параметрів, а не одного chmod на файл)


6
Повільніше, ніж використання xargs, тому що ви виправляєте chmod для кожного файлу, де xargs запустить chmod-процес із такою кількістю файлів, скільки це може вміститися в командному рядку. На дуже великому дереві це може зробити неабияку зміну.
Девід Пашлі

1
Також print0 / xargs -0 буде обробляти навіть дуже дивні імена файлів; не дуже впевнений у знаходженні -exec.
sleske

8

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

# chmod -R . u=rwX,g=rX,o=rX

Магія - це дозвіл X, а не х. Сторінка chmod описує це так:

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

У вашому випадку це не підходить, оскільки ваші файли мають дозвіл на виконання, тому вони відповідатимуть другому тесту.


1
g має бути rwX за 775 та 664.
aventurin

1

Я зробив сценарій з рішення freiheit, він додає основну перевірку аргументів.

#!/bin/sh

if [ $# -lt 1 ]; then
    echo "USAGE: $0 <path>"
    exit 1
fi

find $1 -type d -print0 | xargs -0 chmod 0755
find $1 -type f -print0 | xargs -0 chmod 0644

Гарна ідея. Тим НЕ менше, друга лінія видає помилку , коли мета є каталогом: chmod: missing operand after ‘0644’. Чи можу я запропонувати обернути констатації пошуку чеком, щоб перевірити, чи існує ціль? if [ -d $1 ]; then find $1 -type d -print0 | xargs -0 chmod 0755; fi; if [ -f $1 ]; then find $1 -type f -print0 | xargs -0 chmod 0644; fi
Underverse

Це майже правильно; але якщо ціль - це каталог, ви забули chmod файли в ньому, і якщо це файл, вам потрібно просто chmod тільки цей файл.
sean

0

У випадку, якщо ви використовуєте ssh, не варто змінювати ~/.sshдозволи.

DIR=/home/user
find $DIR -type d -not -path "$DIR/.ssh" -print0 | xargs -0 chmod 0775
find $DIR -type f -not -path "$DIR/.ssh/*" -print0 | xargs -0 chmod 0664

0

Днями я зробив дуже простий скрипт bash, тому що мені потрібно було виправити дозволи. Чому не існує формальної утиліти для скидання основних, некореневих дозволів, файлів і папок?

Сценарій використовує find до 755 всіх папок і 644 бібліотек. Потім він тестує кожен файл за допомогою readelf, щоб побачити, чи має він бінарний заголовок ельфу. Якщо ні, то вона сканує в перших двох символах для shebang #!. Він 755 цих екземплярів і 644 все інше після того, як він перевіряє, чи має файл вже відповідний дозвіл.

Спеціальні випадки обробляються за винятком, як, наприклад, *.bakдля файлів, які ігноруються.

#!/bin/bash
read -r -p "Correct file and folder permissions? [y/N] " chse
if [[ "$chse" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
  echo "Processing ..."
  find -H $(pwd) -type d -exec chmod 0755 {} \;
  # set dirs to 755
  find -H $(pwd) -type f \( -iname '*.so.*' -o -iname '*.so' \) -exec chmod 0644 {} \;
  # libs
  IFS=$'\n'
  for value in $(find -H $(pwd) -type f ! \( -iname '*.so.*' -o -iname '*.so' -o -iname '*.bak' \) -printf '%p\n'); do
    tstbin=$(readelf -l "$value" 2>/dev/null | grep -Pio 'executable|shared')
    if [ -z "$tstbin" ]; then
      tstbat=$(cat "$value" | head -c2 | grep -io '#!')
      if [ -n "$tstbat" ]; then
        perm=$(stat -c '%a' "$value")
        if [ "$perm" != "755" ]; then
          chmod 755 $value
          echo "Set script  755 $value"
          # set batch to 755
        fi
      else
        perm=$(stat -c '%a' "$value")
        if [ "$perm" != "644" ]; then
          chmod 644 $value
          echo "Set regular 644 $value"
          # set regular files to 644
        fi
      fi
      # above aren't elf binary
    else
      perm=$(stat -c '%a' "$value")
      if [ "$perm" != "755" ]; then
        chmod 755 $value
        echo "Set binary  755 $value"
        # set elf binaries to 755
      fi
    fi
  done
  unset IFS
  # process linux permissions for files and folders
else
  echo "Aborted."
fi

0

Я знайшов спрощене рішення C-оболонки. Це може бути не зовсім дурним доказом, але це має працювати в більшості каталогів. Він передбачає, що команда Unix 'file' працює, і знаходить файли exec, щоб повернути їх до дозволів exec:

find /home/user -type d | xargs chmod 0775
find /home/user -type f | xargs -0 chmod 0664
find /home/user -type f -exec file {} \; | grep executable | cut -d":" -f1 | xargs chmod 0775

1
Це не просто повторює деякі відповіді, але вводить помилку та функціональність, яку ОП не вимагав.
RalfFriedl

0

Альтернативою, яка не відповідає точно на початковий запит, але є більш імовірною те, що має намір ОП, є визначення дозволів символічно. Наприклад, я припускаю, що ОП хоче "видалити доступ для запису для публіки та видалити виконавчий дозвіл з усіх файлів".

Це можливо, якщо ви використовуєте символічне представлення дозволів.

  • ow - "видалити доступ для запису з громадськості" ("o" - інші, "-" - видалити, "w" - написати)
  • ax - "видалити виконання для всіх лише файлів" ("a" - всі, "-" - видалити, "x" - виконати)

Записуючи це таким чином, а не чітко встановлюючи "0664", ви уникаєте випадкового дозволу на отримання додаткових дозволів на файли, які раніше були заблоковані. Наприклад, якщо файл був 0770, він не стане 0664 помилково.

Для виконання першої вимоги ви можете просто скористатися chmod:

chmod --recursive o-w $dir

Щоб виконати другу вимогу:

find $dir -type f -exec chmod a-x {} +

Або робити обидва:

find $dir -type f -exec chmod a-x,o-w {} +
find $dir -type d -exec chmod o-w {} +
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.