Назад | Перейти на главную страницу

Необходимо исправить права доступа к файлам в домашнем каталоге пользователя

Есть ли у кого-нибудь инструмент или сценарий, который рекурсивно исправляет права доступа к файлам в каталоге?

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

Каталоги должны быть 775, а все остальные файлы могут быть 664. Все файлы являются изображениями, документами или MP3, поэтому ни один из них не должен быть исполняемым. Если бит каталога установлен, он требует выполнения, в противном случае ему просто нужны пользователь и группа, чтение и запись.

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

Это должно помочь:

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

find может сделать трюк самостоятельно с -exec:

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

чтобы команда find не порождала chmod для каждой записи:

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

(это фактически вызывает chmod один раз со списком всех файлов в качестве параметров, а не по одному chmod для каждого файла)

Этот ответ не решит вашу проблему, но кто-то может счесть его полезным для аналогичной проблемы, когда файлы имеют меньше разрешений, чем должны.

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

Магия - это разрешение X, а не x. На странице руководства chmod это описано так:

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

Это не подходит в вашем случае, поскольку ваши файлы имеют разрешение на выполнение, поэтому будет соответствовать второму тесту.

На днях я сделал очень простой сценарий bash, потому что мне нужно было исправить разрешения. Почему нет официальной утилиты для сброса базовых разрешений, прав доступа к файлам и папкам без полномочий root?

Скрипт использует поиск до 755 всех папок и 644 библиотек. Затем он проверяет каждый файл с помощью readelf, чтобы увидеть, есть ли у него двоичный заголовок elf. Если нет, он сканирует первые два символа на наличие 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

Я сделал сценарий из решения 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

Если вы используете 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

Я нашел упрощенное решение C-shell. Это не может быть полностью защищенным от дурака, но должно работать для большинства каталогов. Он предполагает, что команда 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

Альтернативой, которая не совсем отвечает на исходный запрос, но более вероятно, что OP намеревается, является символическое указание разрешений. Например, я предполагаю, что OP хочет «удалить доступ на запись для публики и удалить разрешение на выполнение для всех файлов».

Это возможно, если вы используете символическое представление разрешений.

  • o-w - «удалить доступ на запись для всех» («o» - другие, «-» - удалить, «w» - записать)
  • a-x - это «удалить, выполнить только для всех файлов» («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 {} +