Удаление и добавление разрешения с помощью числовой нотации на той же строке

Хороший скрипт. Обычно я использую все оставшиеся аргументы в качестве списка сайтов. Что-то вроде этого (я не тестировал эти моды):

if [ $# -lt 3 ]; then
    echo >&2 "usage: $0 fileperm folderperm owner [site ...]"
    exit 1
fi

[ . . . ]

fileperm="$1"
folderperm="$2"
owner="$3"
shift 3             # shift first 3 args off of list

if [ $# -eq 0 ]; then
    for dir in /var/www/httpdocs/*/    #stackexchange syntax coloring fix*/
    do
        dir="${dir%/*}"
        chg_perms "/var/www/httpdocs/${dir##*/}" "$fileperm" "$folderperm"
        chg_owner "/var/www/httpdocs/${dir##*/}" "$owner"
    done;
else
    for dir           # step through positional args ($1,$2,...,$N)
    do
        chg_perms "/var/www/httpdocs/$dir" "$fileperm" "$folderperm"
        chg_owner "/var/www/httpdocs/$dir" "$owner"
    done
fi
6
10.09.2018, 01:01
5 ответов

Стандартно только символическая форма позволяет добавлять и удалять биты из текущих разрешений (, хотя см. ответ @ilkkachu , если вы работаете в системе GNU, где chmodподдерживает его с числовой формой как расширение ).

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

Однако вы можете получить предыдущее значение вручную и применить изменения как битовую -логическую операцию.

Например, сzsh:

zmodload zsh/stat
zstat -A mode +mode -- "$file" &&
  perms=$((mode & 8#7777)) &&
  chmod -- $(((perms | 4) & ~ 8#20)) "$file"

Это двоичное ИЛИ(|)с 4, чтобы добавить разрешение на чтение к другим и двоичное И(&)с двоичным НЕ(~)восьмеричного числа 20, чтобы удалить права на запись в группу.

Например, если предыдущие биты разрешения (st _mode & 0777 )были 0660 (rw-rw----), 0660 | 4 будет 0664 (rw-rw-r--), а 0664 & ~020 будет 0644(rw-r--r--).

Теперь я не уверен, почему вы хотите сделать это вместо:

chmod -- g-w,o+r "$file"
3
27.01.2020, 20:20

Обратите внимание на название вашего вопроса:

Removing and adding permission using numerical notation on the same line

С chmodиз GNU coreutils, который у вас, вероятно, есть в системе Linux, вы могли бы использовать

$ chmod -020,+004 test.txt

сделать это. Это работает очевидным образом :средняя цифра для группы, 2для записи; и последняя цифра для «других» и 4для чтения.

Возможность использования +или -в числовом режиме является расширением GNU , например. BSD -на основе chmodна моем Mac выдает ошибку для+004:

$ chmod +004 test.txt
chmod: Invalid file mode: +004

Таким образом, было бы проще, короче, более переносимым и, вероятно, более читабельным просто использовать символическую форму:

$ chmod g-w,o+r test.txt
10
27.01.2020, 20:20

Поскольку вы не указали причину, по которой вы хотите сделать это именно так. Я предполагаю, что вы не знаете, что гораздо быстрее (и imho точнее )просто установить нужный режим, чем переключать флаги один за другим.

Объясняется упрощенно:Укажите 3 числовых значения для состояния установки/снятия всех флагов чтения, записи и выполнения. Для владельца , группы и другиходновременно .

Для упрощения я буду использовать 3 цифры. Но вы должны посмотреть и на остальные флаги , когда привыкнете к этому способу.

Чтобы еще больше упростить:Эти 3 значения являются отдельными позиционными значениями, а не трехзначным числом. Первый устанавливает разрешения для владельца , следующий устанавливает разрешения для группы , а третий устанавливает разрешения для всех остальных(других).

Установка флагов:Сейчас. Некоторые люди путаются в определении , что означает каждая цифра , но это действительно просто, когда вы впервые узнаете, как это делается.

Вот значения флага -:

  • 1=выполнить
  • 2=запись
  • 4=чтение

Теперь вы просто выполняете одну позицию за раз и суммируете ()нужные значения флага -. Если вы хотите установить чтение и выполнение :4+1=5. Если вы хотите читать и писать, но не выполнять :4+2=6.

Примеры

| ### | Owner | Group | Others |
| --- |  ---  |  ---  |  ---   |
| 755 |  RWX  |  R-X  |  R-X   |
| 644 |  RW-  |  R--  |  R--   |

Дополнительную информацию и другие примеры можно увидеть здесь :https://linux.die.net/Linux-CLI/file-permissions.html

Итак, если вы хотите, чтобы группа и другие имели только права на чтение, а владелец должен был иметь права на чтение и запись,ты просто делаешьchmod 644 FILENAME

Вот отличный учебник:Общие сведения о правах доступа к файлам в Linux

Последний совет:Помните, что пользователям необходимо разрешение на выполнение для каталогов, чтобы отображать содержимое.

0
27.01.2020, 20:20

Как сказано во второй строке справочной страницы:

chmod g-w,o+r file

$ ман чмод

CHMOD(1)                         User Commands             CHMOD(1)

NAME
       chmod - change file mode bits

SYNOPSIS
       chmod [OPTION]... MODE[,MODE]... FILE...

или 1-я строка chmod --help

Usage: chmod [OPTION]... MODE[,MODE]... FILE...
4
27.01.2020, 20:20

РЕДАКТИРОВАТЬ :Увидев ответ ilkkachu, я проверил это, и синтаксис, который он описывает, работает,но справочная страница моей системы (, которую я проверил ), говорит

can be either a symbolic representation of changes to make, or an octal number representing the bit pattern for the new mode bits

, что заставило меня написать исходный ответ (ниже ). Я предполагаю, что это новое изменение и что они забыли обновить справочную страницу.

Исходный ответ ниже:

В заголовке вашего вопроса упоминается «числовая запись», если под этим вы подразумеваете указание режимов в виде восьмеричных чисел, ответ заключается в том, что вы не можете указать изменения с этим, только новый режим файла (s ).

5
27.01.2020, 20:20

Теги

Похожие вопросы