rsync –no-perms иногда игнорирует umask?

Вопрос или проблема

Я пытаюсь понять, как ведет себя rsync --no-perms при копировании файлов с удаленного samba-расшаривания на локальную файловую систему.

Согласно страницам man rsync:

Когда опция -p, --perms выключена: Новые файлы получают свои “нормальные” битовые разрешения, установленные в соответствии с разрешениями исходного файла, замаскированными с разрешениями по умолчанию получающего каталога (либо umask процесса получения, либо разрешения, указанные через стандартные ACL целевого каталога), а специальные битовые разрешения отключены, за исключением случаев, когда новый каталог наследует бит setgid от родительского каталога.

Я использую autofs для Cifs монтирования Samba Share на другой машине таким образом:

/media/ubuntu -fstype=cifs,rw,noperm,credentials=/home/root/creds,iocharset=utf8 ://192.168.1.34/4TB1

Когда я перечисляю конкретный файл в этом расшаривании, он выглядит следующим образом:

root@zoro:/media/hdd# ls -l "/media/ubuntu/movie/4tb1file.txt"
-rwxr-xr-x    1 root     root             0 Oct 21 21:59 /media/ubuntu/movie/4tb1file.txt

И когда я сразу же выполняю команду mount, я могу увидеть все используемые параметры cifs для монтирования этого расшаривания:

/etc/auto.network on /media/ubuntu type autofs (rw,relatime,fd=7,pgrp=5019,timeout=5,minproto=5,maxproto=5,direct)
//192.168.1.34/4TB1 on /media/ubuntu type cifs (rw,relatime,vers=3.02,sec=ntlmssp,cache=strict,username=4tb1,domain=WORKGROUP,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.1.34,file_mode=0755,dir_mode=0755,nounix,serverino,mapposix,noperm,rsize=1048576,wsize=1048576,echo_interval=60,actimeo=1)

Umask на машине, с которой выполняется rsync, равен 0022:

root@zoro:/media/hdd# umask
0022

Если я запускаю эту команду rsync:

root@zoro:/media/hdd# rsync -itrvv --no-perms "/media/ubuntu/movie/4tb1file.txt" /media/hdd

Вот какие разрешения имеет файл после передачи:

root@zoro:/media/hdd# ls -l 4tb1file.txt 
-rwxr-xr-x    1 root     root             0 Oct 21 21:59 4tb1file.txt

Почему разрешения такие же? Разрешения файла в расшаривании – 755. Я ожидал 755 – 022 = 733 (rwx-wx-wx), но вместо этого они все еще (rwxr-xr-x). Хотя я думаю, что это невозможно, потому что umask не может давать разрешения, устанавливая бит на запись, он только может их забирать.

Если же я изменю свой локальный umask на 0044, то обнаружу, что файл с исходными разрешениями 755 (rwxr-xr-x) становится 711 (rwx–x–x) после копирования с помощью rsync --no-perms ...

Так это ответ? Если файл имеет исходные разрешения (в samba-расшаривании) 755 (rwxr-xr-x) и локальный umask равен 022, то разрешения остаются неизменными после передачи файла с rsync --no-perms ...? Но почему?

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

Любая помощь будет очень ценна.

Ответ или решение

Вопрос о поведении команды rsync --no-perms при копировании файлов с удаленной Samba-шары на локальную файловую систему представляет собой интересный аспект работы с правами доступа в Unix-подобных системах. Давайте подробнее разберем, как именно rsync взаимодействует с правами файлов и как умаскировка (umask) влияет на процесс.

Понимание параметра --no-perms

Согласно документации rsync, когда параметр -p или --perms отключен, новые файлы получают «нормальные» права доступа, установленные на основе прав доступа исходного файла, затем применяются маска для прав (umask) и разрешения, установленные для директории назначения. Эта маска действуют на разрешения, разрешая или запрещая определенные права доступа.

Рассмотрим вашу ситуацию

В вашем случае вы копируете файл 4tb1file.txt, который имеет права доступа 755 (rwxr-xr-x) на Samba-шаре. Вы ожидаете, что применив маску 0022, файл должен получить права доступа 733 (rwx-wx-wx). Однако вы наблюдаете, что конечные права остаются равны 755.

Почему так происходит?

  1. Маска (umask) и её роль: Умаскировка не добавляет права. Она только удаляет их. Когда rsync выполняет операцию копирования и установлен параметр --no-perms, права доступа для нового файла устанавливаются на основе исходных прав доступа, но не применяются к ним ограничения, установленные умаскировкой.

  2. Стандартная настройка прав: При значении umask 0022, rsync находит исходные права 755. Поскольку эти права уже включают все разрешения, которые могут быть добавлены в рамках umask, результатом будет наличие всех тех же разрешений у конечного файла. Умаска в данном случае не влияет на конечный результат, поскольку исходные права уже соответствуют ожиданиям.

  3. Пример с umask 0044: Когда вы изменяете umask на 0044, то при копировании, несмотря на исходные права 755, результатом так же становится 711 (rwx–x–x), поскольку умаскировка фактически удаляет разрешения на запись для группы и других. Это демонстрирует, как маска может сработать, когда она фактически мешает полному набору прав.

Непосредственная связь между umask и правами

На практике rsync не применяет маску ко всем поступившим правам, а работает лишь с теми, которые присутствуют на исходном файле. Права будут «скопированы», и если для них нет дополнительных ограничений (из-за umask), они останутся прежними. Таким образом, при копировании файлов с Samba-шары необходимо учитывать, что Samba уже может управлять правами доступа, и результаты могут отличаться от ожиданий при прямом сравнении с локальными файлами.

Выводы

Четкое понимание взаимодействия между правами доступа, умаской и параметрами rsync поможет в будущем избежать недоразумений. Суммируя, можно сказать:

  • rsync --no-perms копирует права доступа из исходного файла, не изменяя их в соответствии с маской, если они уже «позволяют» данное состояние.
  • Умаска влияет только на удаление прав, но не может их добавлять.

Если у вас есть дополнительные уточнения или вопросы по данной теме, не стесняйтесь их задавать.

Оцените материал
Добавить комментарий

Капча загружается...