Вопрос или проблема
Я пытаюсь понять, как ведет себя 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
.
Почему так происходит?
-
Маска (umask) и её роль: Умаскировка не добавляет права. Она только удаляет их. Когда
rsync
выполняет операцию копирования и установлен параметр--no-perms
, права доступа для нового файла устанавливаются на основе исходных прав доступа, но не применяются к ним ограничения, установленные умаскировкой. -
Стандартная настройка прав: При значении umask
0022
,rsync
находит исходные права755
. Поскольку эти права уже включают все разрешения, которые могут быть добавлены в рамках umask, результатом будет наличие всех тех же разрешений у конечного файла. Умаска в данном случае не влияет на конечный результат, поскольку исходные права уже соответствуют ожиданиям. -
Пример с umask
0044
: Когда вы изменяете umask на0044
, то при копировании, несмотря на исходные права755
, результатом так же становится 711 (rwx–x–x), поскольку умаскировка фактически удаляет разрешения на запись для группы и других. Это демонстрирует, как маска может сработать, когда она фактически мешает полному набору прав.
Непосредственная связь между umask и правами
На практике rsync
не применяет маску ко всем поступившим правам, а работает лишь с теми, которые присутствуют на исходном файле. Права будут «скопированы», и если для них нет дополнительных ограничений (из-за umask), они останутся прежними. Таким образом, при копировании файлов с Samba-шары необходимо учитывать, что Samba уже может управлять правами доступа, и результаты могут отличаться от ожиданий при прямом сравнении с локальными файлами.
Выводы
Четкое понимание взаимодействия между правами доступа, умаской и параметрами rsync
поможет в будущем избежать недоразумений. Суммируя, можно сказать:
rsync --no-perms
копирует права доступа из исходного файла, не изменяя их в соответствии с маской, если они уже «позволяют» данное состояние.- Умаска влияет только на удаление прав, но не может их добавлять.
Если у вас есть дополнительные уточнения или вопросы по данной теме, не стесняйтесь их задавать.