为什么 Tar 即使没有传递 `-p`、`--preserve-permissions` 或 `--same-permissions` 开关也会保留原始文件的权限?

为什么 Tar 即使没有传递 `-p`、`--preserve-permissions` 或 `--same-permissions` 开关也会保留原始文件的权限?

man 1 tar

[...]
     -p, --preserve-permissions, --same-permissions
           extract information about file permissions (default for superuser)
[...]
     --no-same-permissions
           apply the user's umask when extracting permissions from the archive
           (default for ordinary users)
[...]

从中我了解到,默认情况下,提取的文件的权限是根据用户的 umask 设置的,除非用户是 root:

% umask
002

所以我提取的文件应该具有权限664666- 002)。

然而:

% touch foo
% chmod +x foo
% ls -l
total 0
-rwxrwxr-x 1 user user 0 nov  3 19:36 foo
% tar cf foo.tar foo
% rm foo
% tar xf foo.tar 
% ls -l
total 12
-rwxrwxr-x 1 user user     0 nov  3 19:36 foo
-rw-rw-r-- 1 user user 10240 nov  3 19:36 foo.tar

即,即使我没有传递-p,--preserve-permissions--same-permissions开关,Tar 仍保留原始文件的权限。

尽管如此,如果我通过了--no-same-permissions开关:

% tar xf foo.tar --no-same-permissions
% ls -l
total 12
-rwxrwxr-x 1 user user     0 nov  3 19:36 foo
-rw-rw-r-- 1 user user 10240 nov  3 19:36 foo.tar

Tar 仍保留原始文件的权限。

有人能解释一下为什么吗?

答案1

由于 adonis(发现问题的人)尚未发表答案,因此我将自己发表一个答案。

[...]
     --no-same-permissions
           apply the user's umask when extracting permissions from the archive
           (default for ordinary users)
[...]

这与我的想法相反,这意味着 umask 应用于存档中的文件夹/文件的权限,而不是像我认为的那样应用于新创建的文件夹/文件(777/ 666)的常规权限。

即提取文件夹/文件而不传递-p,--preserve-permissions--same-permissions开关惯于将权限设置为777 & ~umask/ 666 & ~umask,但设置为folder's/file's_archived_permissions & ~umask

在这个特定的例子中,我还被这样一个事实所欺骗:将 umask 应用于002具有权限的文件775不会改变任何东西,因为775 & ~002 = 775

因此,简而言之,775使用用户 umask 的权限提取文件002,可以正确地生成具有权限的文件775,结果为775 & ~002

相关内容