Вопрос или проблема
В Classic Shell Scripting от O’Reilly, Арнольд Роббинс и Нельсон Х.Ф. Биби приводят следующий пример:
$ umask 023 $ rm -f foo $ cp /bin/pwd foo $ ls -l /bin/pwd foo -rwxr-xr-x 1 root root 10428 2001-07-23 10:23 /bin/pwd -rwxr-xr-- 1 jones devel 10428 2002-09-21 16:37 foo
Получившаяся строка прав
rwxr-xr--
отражает потерю привилегий: группа потеряла доступ на запись, а остальные потеряли доступ на запись и выполнение.
Итак, вывод 023
в начале говорит мне, что в текущей оболочке у вновь созданных файлов будет удалён доступ w
для g
и wx
для o
, так что в то время как я понимаю, что “остальные потеряли доступ на выполнение”, я не понимаю, почему “группа потеряла доступ на запись” и “остальные потеряли доступ на запись”, поскольку у них его изначально не было.
Вы думаете, это просто неточность в формулировке этого комментария, или я что-то упустил?
Кроме того, я попробовал это на своей системе, и результат немного озадачил меня:
$ umask
0023
$ cp /bin/pwd ~/foo
$ ls -l /bin/pwd ~/foo
-rwxr-xr-x 1 root root 35072 Jan 18 19:17 /bin/pwd*
-rw-r--r-- 1 myself myself 35072 Feb 1 12:54 /home/myself/foo
Теперь вывод 0023
должен означать удаление w
для g
и wx
для o
(из которых только x
для o
действительно присутствовал, так что он единственный удалён в этом случае), но вместо этого кажется, что разрешение x
было удалено также для u
и g
.
Почему это так?
Где я могу найти все правила, которые определяют, что происходит с разрешениями, когда я создаю и копирую файл?
Ответ или решение
Файловые разрешения в UNIX-подобных системах являются важным аспектом управления доступом к файлам и директориям. Чтобы понять, как определяются разрешения файла после выполнения команды cp /path/to/a /p/t/b
, необходимо рассмотреть несколько факторов, в том числе текущие настройки umask
, разрешения исходного файла и каталогов, в которые происходит копирование. Рассмотрим теорию, примеры и применение данной задачи.
Теория
В UNIX-подобных системах права доступа к файлам определяются через три категории пользователей: владелец (user), группа (group) и остальные (others). Каждой из этих категорий можно задать доступ на чтение (r), запись (w) и выполнение (x). Октавая система используется для задания этих разрешений, где каждая категория представлена одной цифрой от 0 до 7.
Umask
Umask (user file-creation mode mask) определяет базовые разрешения, которые будут исключены из новых файлов. Например, если умаска равна 023
, это означает, что разрешение на запись будет убрано из группы, а разрешение на запись и выполнение — из всех других (others). Это работает как инверсия: umask показывает, какие разрешения не должны быть установлены по умолчанию.
Команда cp
При копировании файлов команда cp
создает новый файл с разрешениями, которые являются комбинацией разрешений исходного файла и умаски. Однако здесь важно учитывать, что cp
по умолчанию не сохраняет флаг выполнения для новых файлов, если они создаются в стандартных условиях. Если нужна аналогичность с исходным файлом, используется ключ -p
или --preserve
.
Примеры
Рассмотрим пример, упомянутый в условии:
- Исходный файл
/bin/pwd
имеет разрешенияrwxr-xr-x
. - Умаска установлена как
023
, что означает, что:- Для группы будет отсутствовать
w
. - Для остальных (
others
) будут отсутствоватьw
иx
.
- Для группы будет отсутствовать
Можно ожидать, что при копировании файла без выполнения cp -p
, новые permissions должны соответствовать rwxr-xr-x
за исключением исключений умаски (без учета флага выполнения в создаваемом файле).
Однако в примерах:
/home/myself/foo
показываетrw-r--r--
, это указывает, что выполнение убрано также и у владельца и группы.
Применение
Познав природу работы умаски и базовых команд в UNIX, важно помнить следующие ключевые моменты:
- При копировании исполняемых файлов с
cp
, если флаг исполнения не указан, он, как правило, не сохраняется в новом файле, если сама командаcp
не была дополнительно настроена. - Чтобы копировать с сохранением permissions, в том числе флагов, используйте ключ
-a
для архивации или-p
для сохранения атрибутов.
Теперь, как можно найти и управлять этими правилами? Вот несколько рекомендаций:
-
Изучение документации: Воспользуйтесь
man cp
для получения полной информации о параметрах и поведении командыcp
. -
Экспериментирование: Попробуйте различные комбинации
umask
и ключейcp
на тестовом файле, чтобы на практике увидеть разницу в поведении. -
Скрипты и автоматизация: Создайте скрипты, которые будут устанавливать нужную
umask
и использовать нужные ключи при копировании, чтобы быть уверенными в предсказуемости результата.
Конечный вывод заключается в важности понимания взаимодействия между исходными разрешениями, умаской и инструментами командной строки, что необходимо для корректной работы, будь то простая задача копирования или управление сложными структурами файлов.