Хороший скрипт. Обычно я использую все оставшиеся аргументы в качестве списка сайтов. Что-то вроде этого (я не тестировал эти моды):
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
Стандартно только символическая форма позволяет добавлять и удалять биты из текущих разрешений (, хотя см. ответ @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"
Обратите внимание на название вашего вопроса:
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
Поскольку вы не указали причину, по которой вы хотите сделать это именно так. Я предполагаю, что вы не знаете, что гораздо быстрее (и imho точнее )просто установить нужный режим, чем переключать флаги один за другим.
Объясняется упрощенно:Укажите 3 числовых значения для состояния установки/снятия всех флагов чтения, записи и выполнения. Для владельца , группы и другиходновременно .
Для упрощения я буду использовать 3 цифры. Но вы должны посмотреть и на остальные флаги , когда привыкнете к этому способу.
Чтобы еще больше упростить:Эти 3 значения являются отдельными позиционными значениями, а не трехзначным числом. Первый устанавливает разрешения для владельца , следующий устанавливает разрешения для группы , а третий устанавливает разрешения для всех остальных(других).
Установка флагов:Сейчас. Некоторые люди путаются в определении , что означает каждая цифра , но это действительно просто, когда вы впервые узнаете, как это делается.
Вот значения флага -:
Теперь вы просто выполняете одну позицию за раз и суммируете ()нужные значения флага -. Если вы хотите установить чтение и выполнение :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
Последний совет:Помните, что пользователям необходимо разрешение на выполнение для каталогов, чтобы отображать содержимое.
Как сказано во второй строке справочной страницы:
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...
РЕДАКТИРОВАТЬ :Увидев ответ 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 ).