rsync pull 无视我的 umask,为什么?

Aar*_*ams 4 rsync umask

我的umask0002

那么当 I 时rsync -r me@remote:new .,为什么结果组不可写?

drwxrwsr-x 10 root       developers 4096 Aug 22 12:55 .
drwxrwsr-x 12 root       developers 4096 Jul 14 19:05 ..
drwxrwsr-x  3 root       developers 4096 May 16 15:04 old
drwxr-sr-x  4 aaronadams developers 4096 Jun 26 15:17 new
Run Code Online (Sandbox Code Playgroud)

Aar*_*ams 7

我错误地认为rsync没有-p标志的推/拉工作类似于git推/拉,并且新文件将具有完全权限减去umask.

但是,即使没有-p标志,rsync仍然保留源文件的权限。该-p标志仅指示rsync(尝试)忽略接收者的umask.

根据man rsync

新文件的“正常”权限位设置为源文件的权限被接收端的umask设置屏蔽,并且它们的特殊权限位被禁用,除非新目录setgid从其父目录继承了一些。

更好的是,有一个关于如何创建忽略源权限的标志的简单建议:

要为新文件提供目标默认权限(同时保持现有文件不变),请确保--perms关闭并使用该选项--chmod=ugo=rwX(这确保启用所有非屏蔽位)。如果您想让后一种行为更易于键入,您可以popt为其定义一个别名,例如将此行放在文件中~/.popt(这定义了-s选项,并包含--no-g使用目标目录的默认组):

rsync alias -s --no-p --no-g --chmod=ugo=rwX
Run Code Online (Sandbox Code Playgroud)

然后,您可以在这样的命令中使用这个新选项:

rsync -asv src/ dest/
Run Code Online (Sandbox Code Playgroud)

(警告:确保-a不遵循-s,否则将重新启用--no-*选项。)

我想我会这样做!

  • 使用 --chmod=ugo=rwX,Dg+s 在目标目录及其子目录中预设 setgid 位(否则它们将变为 rwx 而不是 rws)。D 是特定于 rsync 的,并且只允许 chmod 目录(对于文件,它只会是 F)。 (2认同)