Как сохранить права доступа к файлам при копировании в Linux
Файловые права — часть спецификации Unix. При копировании создаётся новый файл, поэтому его права формируются заново под влиянием umask текущего пользователя и возможностей целевой файловой системы. В результате копии могут получить другие права, владельца или потерять расширенные атрибуты.
Ниже — простые способы сохранить права и связанные атрибуты при копировании в Linux, а также проверка и частые причины, когда этого не происходит.
Коротко о ключевых понятиях
- umask — маска, определяющая какие биты прав отключать при создании нового файла.
- ACL — дополнительные списки управления доступом (Access Control Lists).
- xattr — расширенные атрибуты, используемые для метаданных (например, метки SELinux).
- Файловая система — некоторые FS (FAT32, vfat) не поддерживают Unix-права.
Сохранение прав с помощью cp
Команда cp поддерживает несколько режимов для сохранения атрибутов:
- cp -p — сохраняет режим (права), владельца и временные метки.
- cp -rp — рекурсивно копирует директории и сохраняет атрибуты.
- cp -a — режим Archive: эквивалентно -dR –preserve=all; сохраняет символьные ссылки, права, владельца, временные метки и контексты, если возможно.
Примеры:
cp -p source-file dest-filecp -rp source-dir/ dest-dir/cp -a source-dir/ dest-dir/Используйте cp -a для локального копирования, когда нужно максимально сохранить состояние исходной директории. Обратите внимание: при копировании между разными машинами cp не применяется — для этого используйте rsync или scp.
Сохранение прав с помощью rsync
rsync часто предпочтительнее для больших объёмов и синхронизации. Его баллы силы: копирует только изменённые части файлов, умеет работать по SSH и имеет гибкие опции для сохранения разных типов метаданных.
Базовый синтаксис для сохранения прав:
rsync -a source-dir/ dest-dir/Флаг -a (архив) эквивалентен набору опций, включающих рекурсивность, сохранение прав, времён, владельца и групп. Для полного сохранения всех атрибутов и поведения, особенно при переносе на другой Linux-хост, используйте набор:
rsync -aHAX --numeric-ids source-dir/ dest-dir/- -H сохраняет жёсткие ссылки.
- -A сохраняет ACL.
- -X сохраняет расширенные атрибуты (xattr), включая метки SELinux.
- –numeric-ids использует числовые uid/gid без попыток разрешить имена — полезно при переносе между машинами с разными базами пользователей.
Для удобного вывода добавьте -v (verbose) и -h (human-readable):
rsync -avh source-dir/ dest-dir/Внимание к слэшу в конце: source-dir/ означает «содержимое каталога», а source-dir (без слэша) — сам каталог как элемент. Аналогично для dest: лишний или отсутствующий слэш меняет структуру результата.
Пример удалённого копирования по SSH
rsync -aHAX --numeric-ids -e ssh user@remote:/path/to/source/ /local/path/Это предпочтительнее scp, если важно сохранить сложные атрибуты и ускорить последующие синхронизации.
Проверка прав после копирования
Проверьте права и ACL следующими командами:
ls -l path/to/file # краткий список прав и владельца
stat path/to/file # подробная информация о файле
getfacl path/to/file # вывод ACL, если естьgetfacl source-file
getfacl dest-fileДополнительно: для SELinux проверьте getenforce и ls -Z.
Частые причины, почему права не сохраняются
- Целевая файловая система не поддерживает Unix-права (например, vfat, FAT32).
- umask на целевой машине «режет» создаваемые биты при использовании инструментов, которые не сохраняют права.
- Копирование между машинами с разными UID/GID: владельцы будут отображаться по числам или маппиться неправильно без –numeric-ids.
- Отсутствие прав root: смена владельца (chown) при копировании требует привилегий.
- Потеря ACL/xattr если использовалась команда без соответствующих опций (rsync без -A/-X, cp без –preserve=xattr).
Альтернативные подходы
- scp — простой способ для безопасной пересылки файлов между хостами, но он не сохраняет ACL и xattr.
- tar | ssh — упаковка в tar сохраняет структуры и атрибуты; полезно для переноса между машинами и при копировании на файловые системы, поддерживающие атрибуты:
cd /source/dir && tar cf - . | ssh user@host 'cd /dest/dir && tar xpf -'- rsync + snapshot/backup tools — для регулярных резервных копий пользуйтесь инструментами, которые сохраняют метаданные и умеют инкрементально восстанавливать.
Когда метод не сработает: примеры
- Копирование файлов с SELinux метками на vfat-диск — метки будут потеряны.
- Перенос системных файлов между машинами с разной UID-базой без –numeric-ids — владельцы поменяются.
- Резервное копирование от непривилегированного пользователя: chown не выполнится, и владельцы останутся другими.
Мини‑методология: что делать по шагам
- Оцените, какие атрибуты нужно сохранить: права, владелец, ACL, xattr/SELinux, жёсткие ссылки.
- Выберите инструмент: cp для простых локальных задач, rsync для масштабных и сетевых копий, tar для переносов с упаковкой.
- Соберите команду: rsync -aHAX –numeric-ids для большинства случаев.
- Выполните тестовую копию на небольшой наборе файлов.
- Проверьте через ls -l, getfacl, stat и (при SELinux) ls -Z.
- После успешного теста применяйте к реальным данным и автоматизируйте с учётом прав доступа.
Контрольные списки по ролям
Системный администратор:
- Использовать rsync -aHAX –numeric-ids.
- Запуск от root при необходимости сохранить владельцев.
- Тестировать и документировать карту UID/GID между хостами.
Разработчик / DevOps:
- Для локального копирования использовать cp -a.
- Для CI/CD — включать проверки getfacl в пайплайне.
Оператор резервного копирования:
- Выбирать инструмент, поддерживающий инкрементальное восстановление.
- Учитывать поддержку ACL и xattr при хранении бэкапов.
Безопасность и приватность
Сохранение владельца и групп важно для доступа, но перенос владельческих метаданных между доменами может раскрыть информацию о пользователях. При копировании в многопользовательской среде проверьте соответствие политикам доступа и требованиям конфиденциальности.
Краткая таблица опций (факто‑бокс)
- cp -p — права, владелец, временные метки
- cp -a — архивный режим, сохраняет всё, что возможно
- rsync -a — базовый архивный режим
- rsync -aHAX –numeric-ids — сохраняет права, ACL, xattr, жёсткие ссылки, использует числовые uid/gid
Короткий словарь (1 строка)
- umask: маска, отключающая биты прав при создании файла.
- ACL: расширенные списки управления доступом.
- xattr: расширенные атрибуты файла (метаданные).
- SELinux: подсистема безопасности, добавляющая метки безопасности.
Рекомендации по тестированию
- Тестовый сценарий: выберите папку с обычными файлами, ACL и xattr; скопируйте на целевой диск и сравните ls -l, getfacl и getfattr.
- При сетевом переносе протестируйте с –numeric-ids и без, чтобы увидеть разницу в отображении владельцев.
Important: Всегда выполняйте тестовую копию и проверку прав перед массовой операцией на продакшн-данных.
Итог: для большинства задач нужен rsync с опциями -aHAX –numeric-ids; для простых локальных копий cp -a отлично подходит. После копирования проверяйте права и дополнительные атрибуты командами ls, stat и getfacl.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone