例子:
# 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 中行为的原因chmod
在coreutils
6.0发行说明:
chmod
、install
、mkdir
现在保留目录的 set-user-ID 和 set-group-ID 位,除非您明确提出其他要求。chmod 755 DIR
例如,chmod u=rwx,go=rx DIR
现在保留 的DIR
set-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 10mkdir -m 777 D
、mkdir -m g-s D
和chmod 0777 D
所有版本都保留D
setgid 位,您必须使用类似的方法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