显示启动权限

显示启动权限

例子:

# show starting permissions
% stat -c '%04a' ~/testdir
0700

# change permissions to 2700
% chmod 2700 ~/testdir

# check
% stat -c '%04a' ~/testdir
2700

# so far so good...

# now, change permissions back to 0700
% chmod 0700 ~/testdir

# check
% stat -c '%04a' ~/testdir
2700

# huh???

# try a different tack
% chmod g-w ~/testdir
% stat -c '%04a' ~/testdir
0700

错误还是功能?

为什么chmod 0700 ~/testdir将权限从 更改为2700失败0700

我在几个不同的文件系统中观察到相同的行为。例如,在最新的一个中,mount的输出的相关行是

/dev/sda5 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)

另外,FWIW

% stat -c '%04a' ~/
0755

答案1

假设您使用的是 GNU chmod,这记录在联机帮助页

chmod 保留目录的 set-user-ID 和 set-group-ID 位,除非您另外明确指定。您可以使用u+s和等符号模式设置或清除这些位g-s,也可以使用数字模式设置(但不能清除)这些位。

这是允许的POSIX

对于八进制中设置的每个位,应设置下表所示的相应文件权限位;所有其他文件权限位均应清除。对于普通文件,对于set-user-ID-on-execution或set-group-ID-on-execution对应的八进制数中设置的每个位,应设置下表所示的位;如果这些位未在八进制数中设置,则它们将被清除。对于其他文件类型,是否接受设置或清除执行时设置用户 ID 或执行时设置组 ID 位的请求是由实现定义的。

GNU 中行为的原因chmodcoreutils6.0发行说明

chmodinstallmkdir现在保留目录的 set-user-ID 和 set-group-ID 位,除非您明确提出其他要求。chmod 755 DIR例如, chmod u=rwx,go=rx DIR现在保留 的DIRset-user-ID 和 set-group-ID 位而不是清除它们,对于mkdir -m 755 DIR和 也类似mkdir -m u=rwx,go=rx DIR。要清除这些位,请以符号模式明确提及它们,例如 mkdir -m u=rwx,go=rx,-s DIR。要设置它们,请以符号或数字模式明确提及它们,例如mkdir -m 2755 DIR, mkdir -m u=rwx,go=rx,g+s DIR。此更改是为了方便这些位从父级继承的系统。不幸的是,其他操作系统在这里并不一致,并且可移植脚本不能假定这些位已设置、清除或保留,即使明确提及这些位也是如此。例如,OpenBSD 3.9mkdir -m 777 D保留D的 setgid 位但chmod 777 D将其清除。相反,Solaris 10 mkdir -m 777 Dmkdir -m g-s Dchmod 0777 D所有版本都保留Dsetgid 位,您必须使用类似的方法chmod g-s D来清除它。

还有更多关于该主题的内容第8391章,包括前导 0 不明确的进一步理由(在用户看来,它可能表示已清除的位或八进制值)。该coreutils手册还有一个专门的部分,目录以及设置用户 ID 和设置组 ID 位;这表明有 GNU 扩展允许清除有问题的位:

chmod =700 ~/testdir
chmod 00700 ~/testdir

两者都清除位(但都是不可移植的)。

答案2

尝试这个:

chmod 000700 ~/testdir

答案3

显示启动权限

% stat -c '%04a' ~/testdir 0700

==> 好的!

将权限更改为2700

% chmod 2700 ~/testdir

==> 请注意,您正在设置组 ID!

查看

% stat -c '%04a' ~/testdir 2700

==> 好的!

到目前为止,一切都很好...

现在,将权限更改回 0700

% chmod 0700 ~/testdir

==> 再次请注意,您将删除限制删除或粘性标记(不是组 ID)。

查看

% stat -c '%04a' ~/testdir 2700

啊???

尝试不同的策略

% chmod gw ~/testdir % stat -c '%04a' ~/testdir 0700

=================================================== ========= 最后,你可以使用这个命令来获得成功:

chmod 000700 ~/testdir

相关内容