chmod [-fR] absolute-mode file...
chmod [-fR] symbolic-mode-list file...
chmod [-fR] acl_operation file...
chmod [-fR] [-@ named_attribute]...attribute_specification_list file...
chmod 实用程序可更改或分配文件的模式。
chmod 也可用于修改文件和目录的访问控制列表 (Access Control List, ACL),并修改正规文件、目录和不透明扩展属性文件的布尔读写系统属性。
绝对模式命令行格式如下:
chmod [options] absolute-mode file . . .
其中 absolute-mode 使用八进制数字 nnnn 指定,定义如下:
一个从 0 到 7 的数字。绝对模式通过以下任意模式的 OR 运算构建而成:
执行时设置用户 ID。
如果 # 为 7、5、3 或 1,则在执行时设置组 ID。
如果 # 为 6、4、2 或 0,则启用强制性锁定。
对于目录,通过用于传播组 ID 的 BSD 语义创建文件。使用该选项,在目录中创建的文件和子目录将继承目录而非当前进程的组 ID。对于目录,只能使用符号模式设置或清除 setgid 位(分别使用 g+s 或 g-s)。
启用 sticky 位。请参见 chmod(2)。
允许所有者读取。
允许所有者写入。
允许所有者执行(在目录中搜索)。
允许所有者读取、写入和执行(搜索)。
允许组读取。
允许组写入。
允许组执行(在目录中搜索)。
允许组读取、写入和执行(搜索)。
允许其他用户读取。
允许其他用户写入。
允许其他用户执行(在目录中搜索)。
允许其他用户读取、写入和执行(搜索)。
对于目录,无法在绝对模式 (chmod 20#0 ...) 下设置(或清除)setgid 位;必须在符号模式下使用 'chmod g+s ...'(或 'chmod g-s ...')进行设置。
符号模式命令行格式如下:
chmod [options] symbolic-mode-list file . . .
其中 symbolic-mode-list 是符号模式表达式的逗号分隔列表(中间无空格),格式如下:
[who] operator [permissions]
将按指定顺序执行运算。如果一个运算符后跟多个 permissions 字母,将同时执行相应的多项运算。
零个或多个字符 u、g、o 和 a,指定要更改或分配谁的权限:
用户的权限
组的权限
其他用户的权限
所有权限(用户、组和其他用户)
如果省略了 who,则缺省为 a,但是会考虑文件模式创建掩码(有关更多信息,请参见 sh(1) 或 csh(1) 中的 umask)的设置。如果省略了 who,chmod 不会覆盖用户掩码的限制。
+、− 或 =,指定要如何更改权限:
添加权限。
如果省略了 permissions,将不添加任何内容。
如果省略了 who,将添加由 permissions 表示的文件模式位,文件模式创建掩码中有相应位的 except。
如果指定了 who,将添加由 permissions 表示的文件模式位。
解除权限。
如果省略了 permissions,将不执行任何操作。
如果省略了 who,将清除由 permissions 表示的文件模式位,文件模式创建掩码中有相应位的 except。
如果指定了 who,将清除由 permissions 表示的文件模式位。
绝对分配权限。
如果省略了 who,将清除所有文件模式位;如果指定了 who,将清除由 who 表示的文件模式位。
如果省略了 permissions,将不执行其他任何操作。
如果省略了 who,将添加由 permissions 表示的文件模式位,文件模式创建掩码中有相应位的 except。
如果指定了 who,将添加由 permissions 表示的文件模式位。
= 有一种绝对效应,即重置由 who 表示的其他所有位,这与其他符号运算不同。省略 permissions 只在使用 = 解除所有权限时有用。
以下字母的任意兼容组合:
强制性锁定
读取权限
用户或组 set-ID
sticky 位
写入权限
执行权限
执行权限,如果文件为目录或者如果其他用户类之一具有执行权限
分别表示将从当前用户、组或其他用户模式中解除 permission。
文件的权限可能会因用户标识号 (user identification number, UID) 或组标识号 (group identification number, GID) 而异。权限以三个序列描述,每个序列包含三个字符:
|
本例(用户、组和其他用户都具有读取、写入和执行指定文件的权限)说明了授予权限的两个类别:访问类和权限本身。
字母 s 只有与 u 或 g 一起使用才有意义,而 t 只有与 u 一起使用才起作用。
文件和记录强制性锁定 (l) 是指某个文件能够在程序访问该文件的同时锁定其读取或写入权限。
在设置了 set-group-ID 位(反映为 'ls -ld' 输出中的 -----s--- 或 -----l---)的目录中,将使用父目录而非当前进程的组 ID 创建文件和子目录。
无法在允许组执行的同时锁定文件禁止执行。此外,也无法在启用 set-group-ID 位的同时锁定文件禁止执行。因此,以下示例中的命令无效,将导致显示错误消息:
chmod g+x,+l file chmod g+s,+l file
只有某个文件或目录的所有者(或超级用户)可更改该文件或目录的模式。只有超级用户可设置非目录文件的 sticky 位。如果您不是超级用户,chmod 将屏蔽 sticky 位,但是不会返回错误。要启用某个文件的 set-group-ID 位,您自己的组 ID 必须对应于该文件的组 ID,并且必须设置组执行。
访问控制列表 (Access Control List, ACL) 是访问控制条目 (Access Control Entries, ACE) 的列表,每个 ACE 定义特定某个用户类的访问权限。ACE 列表将从零开始进行编号。ACE 在 ACL 中的位置称为 index。该索引将用作下方所述多个 chmod 命令的参数。有关 ACL 和 ACE 的详细说明,请参见在 Oracle Solaris 11.2 中管理 ZFS 文件系统 。
Oracle Solaris 实用程序(包括 chmod)既支持 NFSv4,也支持较新的 POSIX 样式的 ACL 规范。这些规范阐明了下方所示 acl_specification 字段的语法和语义。这两种 ACL 规范将在下文各自相应的小节进行介绍。
ACL 运算命令行格式如下:
chmod [options] A[index]- file ... chmod [options] A-acl_specification file ... chmod [options] A[index]{+|=}acl_specification file ...
其中 acl_specification 是逗号分隔列表(中间无空格),格式如下:
将 acl_specification 中指定的访问控制条目 (Access Control Entries, ACE) 附加到文件 ACL 的开头。根据文件系统,ACL 应用于文件时可进行重新排序。如果指定了可选 index,则将在指定的 index 前面插入新 ACE。
删除文件当前 ACL 的所有 ACE,将当前的 ACL 替换为仅表示当前文件模式的新 ACL。
删除 index 编号指定的 ACE。
删除 acl_specification 指定的 ACE(如果当前文件的 ACL 中存在)。
将文件的整个 ACL 替换为 acl_specification。
从特定索引编号开始替换文件当前 ACL 中的 ACE。如果指定了多个 ACE,则 acl_specification 中的每个后续 ACE 替换当前 ACL 中的相应 ACE。
POSIX 样式的 ACL(由 UFS 支持)指定为以下冒号 (:) 分隔字段。
文件所有者权限。
特定用户的权限。
文件组成员权限。
特定组的权限。
文件所有者或文件组成员以外的其他用户的权限。
ACL 掩码。掩码条目指定允许用户(所有者除外)和组具有的最大权限。
缺省文件所有者权限。
特定用户的缺省权限。
缺省文件组成员权限。
特定组的缺省权限。
文件所有者或文件组成员之外的其他用户的缺省权限。
缺省 ACL 掩码。
使用以上规范可指定 ACL,例如:
user:tom:rw-,mask:rwx,group:staff:r-xNFSv4 ACL 规范(由 NFSv4 和 ZFS 支持)
NFSv4 ACL 可提供更丰富的 ACL 语义。这种规范可提供允许和拒绝条目、更精细的权限和增强的继承控制。
NFSv4 ACL 指定为以下冒号 (:) 分隔字段。
文件所有者的权限。
文件组成员的权限。
所有人(包括文件所有者和组成员)的权限。
特定用户的权限。
特定用户的权限,但是用户由 SID 指定。
特定组的权限。
特定组的权限,但是组由 SID 指定。
特定 SID 的权限,但是 SID 是用户还是组无关紧要。
可采用三种不同 chmod ACL 格式指定权限:详细、紧凑或位置。详细格式使用字词指示用正斜杠 (/) 字符分隔权限。紧凑格式使用权限字母标识权限,位置格式使用权限字母标识权限,或使用连字符 (-) 标识没有任何权限。
详细模式的权限以及其括号中的缩写形式(紧凑和位置模式)如下所述:
读取文件数据的权限。
列出目录内容的权限。
在文件的偏移范围内任意位置修改文件数据的权限。
向目录中添加新文件的权限。
修改文件数据的能力,但仅从 EOF 开始。
当前不支持此权限。
在目录中创建子目录的权限。
读取文件扩展属性的能力。
创建扩展属性或向扩展属性目录写入的能力。
执行文件的权限。
读取文件的基本属性(非 ACL)的能力。
将与文件或目录关联的时间更改为任意值的权限。
删除文件的权限。
有关删除权限行为的更多信息,请参见在 Oracle Solaris 11.2 中管理 ZFS 文件系统 。
删除目录中的文件的权限。
有关删除权限行为的更多信息,请参见在 Oracle Solaris 11.2 中管理 ZFS 文件系统 。
读取文件 ACL 的权限。
写入文件 ACL 的权限。
更改文件所有者的权限。
在支持同步读写的服务器上本地访问文件的权限。
当前不支持此权限。
使用紧凑 ACL 格式时,将通过使用指示权限的 14 个唯一字母来指定权限。
使用位置 ACL 格式时,将权限指定为类似于 ls –V 格式的位置参数。连字符 (-) 指示在该位置未授予任何权限,可以忽略它,只需指定必需的字母。
将按照位置表示法中指定的顺序列出上面的字母。
使用这些字母指定权限的方式如下:
rwx--D--------
可以删除连字符,按如下方式压缩字符串:
rwxD
还支持多个特殊权限集或别名。以下权限集的使用方式与指定详细权限的方式相同。
所有权限。
除 write_acl 和 write_owner 以外的所有权限。
read_data、read_acl、read_attributes 和 read_xattr。
write_data、append_data、write_attributes 和 write_xattr
可以采用三种格式指定可选继承标志。第一种格式使用字词指明各种继承标志,以正斜杠 (/) 字符分隔不同的标志。
继承到所有新创建的文件。
继承到所有新创建的目录。
如果放置到某个目录上,不应用于该目录,仅继承到新创建的文件和目录。该标志要求还要指定 file_inherit 和/或 dir_inherit。
表示 ACL 条目应该继承到目录中的对象,但是向下一个级别后继承应该停止。该标志要求还要指定 file_inherit 和/或 dir_inherit。
列出的继承标志也可以采用紧凑格式指定,或指定为类似于 ls –V 格式的位置参数。连字符表示该位置的继承标志未以 ACL 位置格式指定。
使用这些字母,可以按以下任意等效方式指定继承标志。
file_inherit/dir_inherit/no_propagate
fd-n--
fdn
使用这种继承模型时,可以指定 ACL 条目,例如:
user:tom:read_data/write_data/read_attributes:file_inherit:allow user:fred:read_data:file_inherit/dir_inherit:deny user:bob:read_data:allow
属性运算命令行格式如下:
chmod [options] attribute_specification_list file ...
其中 attribute_specification_list 是指字符 S 后跟一个或多个 attribute_specifications 的逗号分隔列表。每个 attribute_specification 格式如下:
[operator]attribute_specifier
operator 为以下运算符之一:
将关联 attribute_specifier 指定的每个属性调整为与 attribute_specifier 指定的值匹配。
将关联 attribute_specifier 指定的每个属性调整为与 attribute_specifier 指定的值的逆向值匹配。
将关联 attribute_specifier 指定的每个属性调整为与 attribute_specifier 指定的值匹配。将清除与当前文件关联且并非由 attribute_specifier 指定的任何布尔读写扩展系统属性。
如果未在 attribute_specification 中指定 operator,则 chmod 的行为方式如同指定了 + 一样。
attribute_specifier 采用以下几种格式之一:
设置与当前文件关联的所有布尔读写扩展系统属性。
设置由 compact_attribute_list 标识的每个布尔读写扩展系统属性。
设置由 verbose_attribute_setting 标识的每个布尔读写扩展系统属性。
compact_attribute_list 是本节后面属性名称和缩写字符列表中的零个或多个相邻属性缩写字符的列表。compact_attribute_list 中可以包含任意数量的连字符 (-)。系统将忽略这些连字符。
verbose_attribute_setting 是本节后面属性名称和缩写字符列表中的属性名称,也可以选择紧接其前面添加 no。如果属性名称未与 no 一起使用,将设置属性;否则将清除属性。
verbose_attribute_setting_list 是零个或多个逗号分隔 verbose_attribute_setting。
将累积为一个文件指定的多项运算,将其全部设置为一个文件操作数的一项属性设置运算。如果某个属性在 attribute_specification_list 中指定了多次,将应用最后一次指定的运算。
以下是属性名称和缩写字符列表:
缩写字符
H
s
S
R
A
u
i
a
d
q
m
T
支持以下选项:
强制。如果无法更改文件模式,chmod 不会报告错误。
向下递归目录参数,在此过程中设置每个文件的模式。如果遇到符号链接,将更改目标文件的模式,但是不执行递归。
对每个文件操作数的指定扩展属性文件而非文件操作数本身执行属性运算。如果提供了多项 –@ 运算,属性规范模式将应用于每个指定的属性文件。
* 的指定属性会将含义转至 chmod,该命令将认为表示与文件操作数关联的所有扩展属性文件。这不适用于特殊文件 . 和 ..。
.. 的指定属性会将特殊含义转至 chmod,该命令将认为表示文件操作数本身。这样,调用一次 chmod 即可将属性规范模式应用于文件操作数的指定属性文件和文件操作数本身。
支持下列操作数:
表示将对 file 操作数之一指定的每个文件的文件模式位做出的更改。有关更多信息,请参见本手册页“描述”部分中的“绝对模式”和“符号模式”。
表示要对文件 ACL 执行的修改。有关更多信息,请参见“描述”部分中的“ACL 运算”。
acl_operation 采用以下几种格式之一:
A[number] - A-acl_specification A[index]{+|=}acl_specification
表示要对文件属性执行的修改。有关更多信息,请参见本手册页“描述”部分中的“属性运算”。
要修改其文件模式位的文件的路径名。
有关 chmod 遇到大于或等于 2 GB(231 字节)文件时行为的说明,请参见 largefile(5)。
以下示例将拒绝所有人的执行权限:
% chmod a-x file示例 2 允许只读权限
以下示例将允许所有人的只读权限:
% chmod 444 file示例 3 使文件可读可写
以下示例将使文件可由组和其他用户读写:
% chmod go+rw file % chmod 066 file示例 4 锁定文件拒绝访问
以下示例将锁定文件拒绝访问:
$ chmod +l file示例 5 授予对文件的读取、写入、执行和设置组 ID 权限
以下示例将授予所有人对文件的读取、写入和执行权限并启用设置组 ID:
$ chmod a=rwx,g+s file $ chmod 2777 file示例 6 在 ZFS 文件中附加新 ACL 条目
以下示例将在 ZFS 文件中附加新 ACL 条目:
首先,显示当前 ACL:
$ ls -v file.3 -rw-r--r-- 1 marks staff 0 Oct 9 15:49 file.3 0:owner@:execute:deny 1:owner@:read_data/write_data/append_data/write_xattr/ write_attributes/write_acl/write_owner:allow 2:group@:write_data/append_data/execute:deny 3:group@:read_data:allow 4:everyone@:write_data/append_data/write_xattr/execute/ write_attributes/write_acl/write_owner:deny 5:everyone@:read_data/read_xattr/read_attributes/read_acl/ synchronize:allow
执行以下命令:
$ chmod A+user:lp:read_data:deny file.3
显示新 ACL:
$ ls -v file.3 -rw-r--r--+ 1 marks staff 0 Oct 9 15:49 file.3 0:user:lp:read_data:deny 1:owner@:execute:deny 2:owner@:read_data/write_data/append_data/write_xattr/ write_attributes/write_acl/write_owner:allow 3:group@:write_data/append_data/execute:deny 4:group@:read_data:allow 5:everyone@:write_data/append_data/write_xattr/execute/ write_attributes/write_acl/write_owner:deny 6:everyone@:read_data/read_xattr/read_attributes/read_acl/ synchronize:allow示例 7 在 UFS 文件中附加 POSIX 样式的新 ACL 条目
以下示例将在 UFS 文件中附加 POSIX 样式的新 ACL 条目:
首先,显示当前 ACL:
$ ls -v file.2 -rw-r--r-- 1 marks staff 0 Oct 9 15:52 file.2 0:user::rw- 1:group::r-- #effective:r-- 2:mask:r-- 3:other:r--
执行以下命令:
$ chmod A+user:lp:-wx file.2
显示新 ACL:
$ ls -v file.2 -rw-r--r--+ 1 marks staff 0 Oct 9 15:52 file.2 0:user::rw- 1:user:lp:-wx #effective:--- 2:group::r-- #effective:r-- 3:mask:r-- 4:other:r--示例 8 在 ZFS 文件中的特定位置插入 ACL 条目
以下示例将在 ZFS 文件系统中的特定位置插入 ACL 条目:本例还说明了紧凑 ACL 格式的使用方法。
首先,显示 ACL 从中选择要插入新 ACE 的位置。
% ls -V file.1 -rw-r--r--+ 1 root root 0 Oct 6 12:16 file.1 user:lp:rw------------:------:allow owner@:--x-----------:------:deny owner@:rw-p---A-W-Co-:------:allow group@:-wxp----------:------:deny group@:r-------------:------:allow everyone@:-wxp---A-W-Co-:------:deny everyone@:r-----a-R-c--s:------:allow
接下来,在位置 3 插入一个新条目。这样会下推当前在位置 3 至 6 的条目。
执行以下命令:
$ chmod A3+user:marks:r:deny file.1
显示新 ACL:
$ ls -V file.1 -rw-r--r--+ 1 root staff 0 Feb 3 14:13 file.1 user:lp:rw------------:------:allow owner@:--x-----------:------:deny owner@:rw-p---A-W-Co-:------:allow user:marks:r-------------:------:deny group@:-wxp----------:------:deny group@:r-------------:------:allow everyone@:-wxp---A-W-Co-:------:deny everyone@:r-----a-R-c--s:------:allow示例 9 在 UFS 文件中的特定位置插入 POSIX 样式的 ACL
将 ACL 存储到文件系统中时,文件系统将对其进行重新排序。以下示例说明了这种行为。
$ ls -v file.1 -rw-r--r--+ 1 root root 0 Sep 29 16:10 file.1 0:user::rw- 1:user:lp:rw- #effective:r-- 2:group::r-- #effective:r-- 3:mask:r-- 4:other:r--
现在,在索引位置 3 插入一个条目。命令正常执行,但是文件系统会对 ACL 进行重新排序。
$ chmod A3+user:marks:rw- file.1 $ ls -v file.1 -rw-r--r--+ 1 root root 0 Sep 29 16:10 file.1 0:user::rw- 1:user:lp:rw- #effective:r-- 2:user:marks:rw- #effective:r-- 3:group::r-- #effective:r-- 4:mask:r-- 5:other:r--
实际上最终是在位置 2 插入了 ACL 条目,而不是按要求在位置 3 插入。
示例 10 从 ZFS 文件中删除 ACL 条目以下示例将从 ACL 中删除 lp 条目:
$ ls -v file.3 -rw-r--r--+ 1 marks staff 0 Oct 9 15:49 file.3 0:user:lp:read_data:deny 1:owner@:execute:deny 2:owner@:read_data/write_data/append_data/write_xattr/ write_attributes/write_acl/write_owner:allow 3:group@:write_data/append_data/execute:deny 4:group@:read_data:allow 5:everyone@:write_data/append_data/write_xattr/execute/ write_attributes/write_acl/write_owner:deny 6:everyone@:read_data/read_xattr/read_attributes/read_acl/ synchronize:allow
$ chmod A-user:lp:read_data:deny file.3 $ ls -v file.3 -rw-r--r-- 1 marks staff 0 Oct 9 15:49 file.3 0:owner@:execute:deny 1:owner@:read_data/write_data/append_data/write_xattr/ write_attributes/write_acl/write_owner:allow 2:group@:write_data/append_data/execute:deny 3:group@:read_data:allow 4:everyone@:write_data/append_data/write_xattr/execute/ write_attributes/write_acl/write_owner:deny 5:everyone@:read_data/read_xattr/read_attributes/read_acl/ synchronize:allow示例 11 从 UFS 文件中删除 POSIX 样式的 ACL
以下示例将从 ACL 中删除 lp 条目:
$ ls -v file.2 -rw-r--r--+ 1 marks staff 0 Oct 9 15:52 file.2 0:user::rw- 1:user:lp:-wx #effective:--- 2:group::r-- #effective:r-- 3:mask:r-- 4:other:r--
$ chmod A-user:lp:-wx file.2 $ ls -v file.2 -rw-r--r-- 1 marks staff 0 Oct 9 15:52 file.2 0:user::rw- 1:group::r-- #effective:r-- 2:mask:r-- 3:other:r--示例 12 按索引编号从 ZFS 文件中删除特定 ACL 条目
请考虑以下 ACL:
$ ls -v file 0:group:staff:read_data/write_data/execute/read_acl:allow 1:user:bin:read_data:deny 2:user:bin:read_data:allow 3:owner@:write_data/append_data:deny 4:owner@:read_data/write_xattr/execute/write_attributes/write_acl /write_owner:allow 5:group@:write_data/append_data:deny 6:group@:read_data/execute:allow 7:everyone@:write_data/append_data/write_xattr/write_attributes /write_acl/write_owner:deny 8:everyone@:read_data/read_xattr/execute/read_attributes/read_acl /synchronize:allow
删除 bin 的第二个用户条目。
$ chmod A2- file $ ls -v file 0:group:staff:read_data/write_data/execute/read_acl:allow 1:user:bin:read_data:deny 2:owner@:write_data/append_data:deny 3:owner@:read_data/write_xattr/execute/write_attributes/write_acl /write_owner:allow 4:group@:write_data/append_data:deny 5:group@:read_data/execute:allow 6:everyone@:write_data/append_data/write_xattr/write_attributes /write_acl/write_owner:deny 7:everyone@:read_data/read_xattr/execute/read_attributes/read_acl /synchronize:allow示例 13 从 UFS 文件中删除 POSIX 样式的特定 ACL 条目
下面的示例将按索引编号从以下 ACL 中删除 lp 条目:
$ ls -v file.1 -rw-r--r--+ 1 root root 0 Sep 29 16:10 file.1 0:user::rw- 1:user:lp:rw- #effective:r-- 2:group::r-- #effective:r-- 3:mask:r-- 4:other:r-- $ chmod A1- file.1 $ ls -v -rw-r--r--+ 1 root root 0 Sep 29 16:10 file.1 0:user::rw- 1:group::r-- #effective:r-- 2:mask:r-- 3:other:r--示例 14 从文件中删除所有 ACL
以下命令可用于 NFSv4/ZFS 或 POSIX 样式的 ACL。
请考虑以下 ACL:
$ ls -v file.3 -rw-r--r--+ 1 marks staff 0 Oct 9 15:49 file.3 0:user:lp:read_data/write_data:allow 1:user:marks:read_acl:allow 2:owner@:execute:deny 3:owner@:read_data/write_data/append_data/write_xattr/ write_attributes/write_acl/write_owner:allow 4:group@:write_data/append_data/execute:deny 5:group@:read_data:allow 6:everyone@:write_data/append_data/write_xattr/execute/ write_attributes/write_acl/write_owner:deny 7:everyone@:read_data/read_xattr/read_attributes/read_acl/ synchronize:allow
有效地删除现有 ACL 并替换为表示文件权限位的 ACL。
$ chmod A- file.3 $ ls -v file.3 -rw-r--r-- 1 marks staff 0 Oct 9 15:49 file.3 0:owner@:execute:deny 1:owner@:read_data/write_data/append_data/write_xattr/ write_attributes/write_acl/write_owner:allow 2:group@:write_data/append_data/execute:deny 3:group@:read_data:allow 4:everyone@:write_data/append_data/write_xattr/execute/ write_attributes/write_acl/write_owner:deny 5:everyone@:read_data/read_xattr/read_attributes/read_acl/ synchronize:allow示例 15 替换 ZFS 文件中的全部 ACL 条目
如果要完全替换 ACL,请使用以下 chmod 语法:
$ chmod A=owner@:read_data/write_data:allow,group@:read_data/ write_data:allow,user:lp:read_data:allow file.4 $ ls -v file.4 -rw-rw----+ 1 marks staff 0 Oct 9 16:12 file.4 0:owner@:read_data/write_data:allow 1:group@:read_data/write_data:allow 2:user:lp:read_data:allow示例 16 替换 UFS 文件中 POSIX 样式的整个 ACL
该操作稍微有些复杂。替换的 ACL 需要用于表示文件所有者、文件组所有者、其他用户和掩码的一些必要条目以及要设置的其他任何条目。
$ chmod A=user::rw-,group::rw-,other::---,mask:r--, user:lp:r-- file.3 $ ls -v file.3 -rw-r-----+ 1 root root 0 Oct 9 16:14 file.3 0:user::rw- 1:user:lp:r-- #effective:r-- 2:group::rw- #effective:r-- 3:mask:r-- 4:other:---示例 17 替换 ZFS 文件中的特定条目
请考虑以下 ACL:
$ ls -v file.5 -rw-r--r--+ 1 marks staff 0 Oct 9 16:18 file.5 0:user:marks:read_data:allow 1:owner@:execute:deny 2:owner@:read_data/write_data/append_data/write_xattr/ write_attributes/write_acl/write_owner:allow 3:group@:write_data/append_data/execute:deny 4:group@:read_data:allow 5:everyone@:write_data/append_data/write_xattr/execute/ write_attributes/write_acl/write_owner:deny 6:everyone@:read_data/read_xattr/read_attributes/read_acl/ synchronize:allow
现在,将用户 marks 的访问权限从允许更改为拒绝:
$ chmod A0=user:marks:read_data:deny file.5 $ ls -v file.5 -rw-r--r--+ 1 marks staff 0 Aug 23 09:11 file.5 0:user:marks:read_data:deny 1:owner@:read_data/write_data/append_data/write_xattr/write_attributes /write_acl/write_owner:allow 2:group@:write_data/append_data/execute:deny 3:group@:read_data:allow 4:everyone@:write_data/append_data/write_xattr/execute/write_attributes /write_acl/write_owner:deny 5:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize :allow示例 18 替换 UFS 文件中 POSIX 样式的特定 ACL
请考虑以下 ACL:
$ ls -v file.4 -rw-r--r--+ 1 marks staff 0 Oct 9 16:21 file.4 0:user::rw- 1:user:lp:rwx #effective:r-- 2:group::r-- #effective:r-- 3:mask:r-- 4:other:r--
现在,将 lp 的权限从 rwx 更改为 r--:
$ chmod A1=user:lp:r-- file.4 $ ls -v file -rw-r--r--+ 1 marks staff 0 Oct 9 16:21 file.4 0:user::rw- 1:user:lp:r-- #effective:r-- 2:group::r-- #effective:r-- 3:mask:r-- 4:other:r--示例 19 在 ZFS 文件上设置 ACL 继承标志
只能在 ZFS 文件上设置继承标志。在目录上设置 ACL 时,可选择设置多个继承标志。
假设有一个用户 lp 对应的 ACL 条目,您希望其继承到某个目录中新创建的文件。首先,需要在该目录上创建一个可继承的 ACL 条目:
$ chmod A+user:lp:read_data:file_inherit:allow test.dir $ ls -dv test.dir drwxr-xr-x+ 2 marks staff 2 Aug 23 09:08 test.dir/ 0:user:lp:read_data:file_inherit:allow 1:owner@::deny 2:owner@:list_directory/read_data/add_file/write_data/add_subdirectory /append_data/write_xattr/execute/write_attributes/write_acl /write_owner:allow 3:group@:add_file/write_data/add_subdirectory/append_data:deny 4:group@:list_directory/read_data/execute:allow 5:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr /write_attributes/write_acl/write_owner:deny 6:everyone@:list_directory/read_data/read_xattr/execute/read_attributes /read_acl/synchronize:allow
lp 条目即会继承到目录 test.dir 中新创建的文件。
$ touch test.dir/file.test $ ls -v test.dir/file.test -rw-r--r--+ 1 marks staff 0 Oct 9 16:29 test.dir/file.test 0:user:lp::deny 1:user:lp:read_data:allow 2:owner@:execute:deny 3:owner@:read_data/write_data/append_data/write_xattr/ write_attributes/write_acl/write_owner:allow 4:group@:write_data/append_data/execute:deny 5:group@:read_data:allow 6:everyone@:write_data/append_data/write_xattr/execute/ write_attributes/write_acl/write_owner:deny 7:everyone@:read_data/read_xattr/read_attributes/read_acl/ synchronize:allow
用户 lp 条目即会继承到新创建的文件。可以指定继承标志的多个组合。例如,如果希望 lp 条目也继承到多个目录,则可以使用以下命令:
$ chmod A+user:lp:read_data:file_inherit/\ dir_inherit:allow test.dir示例 20 替换 ZFS 文件的系统属性
以下示例将替换 ZFS 文件的系统属性:
$ chmod S=v{archive,hidden,readonly,system,appendonly,\ nonodump,immutable,noav_modified,noav_quarantined,\ nounlink,nosensitive} file1
或
$ chmod S=c{AHRSaiu} file1
或
$ chmod S=c{AHRSa-i--u-} file1
或
$ chmod S=cAHRSaiu file1
或
$ chmod -@ '..' S=cAHRSaiu file1
假设具有相应的特权,则将设置 file1 的以下系统属性:archive、hidden、readonly、system、appendonly、immutable 和 nounlink。假设具有相应的特权,则将清除 file1 的以下系统属性:nodump、av_modified 和 av_quarantined 和 sensitive。
示例 21 清除 ZFS 文件的所有系统属性以下示例将清除 ZFS 文件的所有系统属性:
$ chmod S-a file1
或
$ chmod -@ '..' S-a file1
假设具有相应的特权,则将清除 file1 的所有布尔读写系统属性。
示例 22 设置 ZFS 文件的指定属性文件的系统属性以下示例将设置 ZFS 文件的指定属性文件的系统属性,而非该文件本身的系统属性:
$ chmod -@ myattr S+vhidden file1
这样将设置 file1 的指定属性文件 myattr 的隐藏系统属性,而非该文件本身的隐藏系统属性。
示例 23 设置 ZFS 文件的所有指定属性文件的系统属性以下示例将设置 ZFS 文件的所有指定属性文件的系统属性,而非该文件本身的系统属性:
$ chmod -@ '*' S+a file1示例 24 设置 ZFS 文件的所有指定属性文件的系统属性
以下示例将设置 ZFS 文件的所有指定属性文件的系统属性,以及该文件本身的系统属性:
$ chmod -@ '..' -@ '*' S+vhidden file1
这样将设置 file1 的所有指定属性文件的隐藏系统属性,以及该文件本身的隐藏系统属性。
示例 25 在目录分层结构中向下递归以下示例将在目录分层结构中向下递归,并设置所有指定属性文件、ZFS 文件操作数以及目录本身的所有系统属性:
$ chmod -R -@ '..' -@ '*' S+a directory1
这样将设置所有正规文件的所有指定属性文件和 directory1 目录分层结构中目录的隐藏系统属性,以及 directory1 本身的隐藏系统属性。
示例 26 设置 ZFS 文件的 hidden 和 system 系统属性以下示例将设置 ZFS 文件的 hidden 和 system 系统属性:
$ chmod S+cHS file1
或
$ chmod S+vhidden,+vsystem file1
或
$ chmod S+v{hidden,system} file1
或
$ chmod S+c{-HS--------} file1
或
$ chmod S-v{nohidden,nosystem} file1
或
$ chmod S-v{hidden,system},+v{hidden,system} file1示例 27 清除 ZFS 文件的所有系统属性
以下示例将清除 ZFS 文件的所有系统属性:
$ chmod S-a file1
或
$ chmod S=v{} file1
在下面的两个示例中,最后指定的属性运算优先执行。
在本例中,替换属性名称列表 ({}) 将清除 file1 的所有系统属性:
$ chmod S+cHS,=v{} file1
在本例中,清除属性运算 (–a) 将清除 file1 的所有系统属性:
$ chmod S+vhidden,+vsystem,-a file1示例 28 设置文件的所有布尔读写系统属性的值
以下示例会将某个文件的所有布尔读写系统属性的值设置为与另一个文件的布尔读写系统属性的值相同:
$ chmod S=v`ls -/v file1|sed -n '2s/.*{/{/p'` file2
假设具有相应的特权,并且 file1 和 file2 支持的系统属性相同,则为 file1 设置的所有系统属性也会为 file2 设置。为 file1 清除的所有系统属性也会为 file2 清除。
有关影响 chmod 执行的以下环境变量的描述,请参见 environ(5):LANG、LC_ALL、LC_CTYPE、LC_MESSAGES 和 NLSPATH。
将返回以下退出值:
成功完成。
出现错误。
有关下列属性的说明,请参见 attributes(5):
|
getfacl(1)、ls(1)、setfacl(1)、chmod(2)、fgetattr(3C)、acl(5)、attributes(5)、environ(5)、fsattr(5)、largefile(5)、standards(5)
在 Oracle Solaris 11.2 中管理 ZFS 文件系统
绝对更改对目录的 set-group-ID 位不起作用。必须使用 g+s 或 g-s。
chmod 允许生成无用的模式,前提是这些模式不违法(例如,使文本文件成为可执行文件)。chmod 不会检查文件类型来查看强制性锁定是否有意义。
如果是使用 nosuid 选项挂载的文件系统,则不允许 setuid 执行。
如果使用 chmod 更改包含 ACL 条目的文件的文件组所有者权限,则会同时将文件组所有者权限和 ACL 掩码更改为新的权限。请注意,对于文件中有其 ACL 条目的附加用户和组,新的 ACL 掩码权限可能会更改其有效权限。使用 getfacl(1) 或 ls(1) 命令可确保为所有 ACL 条目设置相应的权限。