手册页部分 1: 用户命令

退出打印视图

更新时间: 2014 年 7 月
 
 

chmod(1)

名称

chmod - 更改文件的权限模式

用法概要

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 指定,定义如下:

n

一个从 07 的数字。绝对模式通过以下任意模式的 OR 运算构建而成:

4000

执行时设置用户 ID。

20 # 0

如果 #7531,则在执行时设置组 ID。

如果 #6420,则启用强制性锁定。

对于目录,通过用于传播组 ID 的 BSD 语义创建文件。使用该选项,在目录中创建的文件和子目录将继承目录而非当前进程的组 ID。对于目录,只能使用符号模式设置或清除 setgid 位(分别使用 g+sg-s)。

1000

启用 sticky 位。请参见 chmod(2)

0400

允许所有者读取。

0200

允许所有者写入。

0100

允许所有者执行(在目录中搜索)。

0700

允许所有者读取、写入和执行(搜索)。

0040

允许组读取。

0020

允许组写入。

0010

允许组执行(在目录中搜索)。

0070

允许组读取、写入和执行(搜索)。

0004

允许其他用户读取。

0002

允许其他用户写入。

0001

允许其他用户执行(在目录中搜索)。

0007

允许其他用户读取、写入和执行(搜索)。

对于目录,无法在绝对模式 (chmod 20#0 ...) 下设置(或清除)setgid 位;必须在符号模式下使用 'chmod g+s ...'(或 'chmod g-s ...')进行设置。

符号模式

符号模式命令行格式如下:

chmod [options] symbolic-mode-list file . . .

其中 symbolic-mode-list 是符号模式表达式的逗号分隔列表(中间无空格),格式如下:

[who] operator [permissions]

将按指定顺序执行运算。如果一个运算符后跟多个 permissions 字母,将同时执行相应的多项运算。

who

零个或多个字符 ugoa,指定要更改或分配谁的权限:

u

用户的权限

g

组的权限

o

其他用户的权限

a

所有权限(用户、组和其他用户)

如果省略了 who,则缺省为 a,但是会考虑文件模式创建掩码(有关更多信息,请参见 sh(1)csh(1) 中的 umask)的设置。如果省略了 whochmod 不会覆盖用户掩码的限制。

operator

+=,指定要如何更改权限:

+

添加权限。

如果省略了 permissions,将不添加任何内容。

如果省略了 who,将添加由 permissions 表示的文件模式位,文件模式创建掩码中有相应位的 except

如果指定了 who,将添加由 permissions 表示的文件模式位。

解除权限。

如果省略了 permissions,将不执行任何操作。

如果省略了 who,将清除由 permissions 表示的文件模式位,文件模式创建掩码中有相应位的 except

如果指定了 who,将清除由 permissions 表示的文件模式位。

=

绝对分配权限。

如果省略了 who,将清除所有文件模式位;如果指定了 who,将清除由 who 表示的文件模式位。

如果省略了 permissions,将不执行其他任何操作。

如果省略了 who,将添加由 permissions 表示的文件模式位,文件模式创建掩码中有相应位的 except

如果指定了 who,将添加由 permissions 表示的文件模式位。

= 有一种绝对效应,即重置由 who 表示的其他所有位,这与其他符号运算不同。省略 permissions 只在使用 = 解除所有权限时有用。

permission

以下字母的任意兼容组合:

l

强制性锁定

r

读取权限

s

用户或组 set-ID

t

sticky 位

w

写入权限

x

执行权限

X

执行权限,如果文件为目录或者如果其他用户类之一具有执行权限

ugo

分别表示将从当前用户、组或其他用户模式中解除 permission

文件的权限可能会因用户标识号 (user identification number, UID) 或组标识号 (group identification number, GID) 而异。权限以三个序列描述,每个序列包含三个字符:

用户
其他用户
rwx
rwx
rwx

本例(用户、组和其他用户都具有读取、写入和执行指定文件的权限)说明了授予权限的两个类别:访问类和权限本身。

字母 s 只有与 ug 一起使用才有意义,而 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,并且必须设置组执行。

ACL 运算

访问控制列表 (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 是逗号分隔列表(中间无空格),格式如下:

A[index]+acl_specification

acl_specification 中指定的访问控制条目 (Access Control Entries, ACE) 附加到文件 ACL 的开头。根据文件系统,ACL 应用于文件时可进行重新排序。如果指定了可选 index,则将在指定的 index 前面插入新 ACE。

A-

删除文件当前 ACL 的所有 ACE,将当前的 ACL 替换为仅表示当前文件模式的新 ACL。

Aindex-

删除 index 编号指定的 ACE。

A-acl_specification

删除 acl_specification 指定的 ACE(如果当前文件的 ACL 中存在)。

A=acl_specification

将文件的整个 ACL 替换为 acl_specification

A[index]=acl_specification

从特定索引编号开始替换文件当前 ACL 中的 ACE。如果指定了多个 ACE,则 acl_specification 中的每个后续 ACE 替换当前 ACL 中的相应 ACE。

POSIX 样式的 ACL 规范(由 UFS 支持)

POSIX 样式的 ACL(由 UFS 支持)指定为以下冒号 (:) 分隔字段。

user::perms

文件所有者权限。

user:username:perms

特定用户的权限。

group::perms

文件组成员权限。

group:groupname:perms

特定组的权限。

other::perms

文件所有者或文件组成员以外的其他用户的权限。

mask:perms

ACL 掩码。掩码条目指定允许用户(所有者除外)和组具有的最大权限。

default:user::perms

缺省文件所有者权限。

default:user:username:perms

特定用户的缺省权限。

default:group::perms

缺省文件组成员权限。

default:group:groupname:perms

特定组的缺省权限。

default:other:perms

文件所有者或文件组成员之外的其他用户的缺省权限。

default:mask:perms

缺省 ACL 掩码。

使用以上规范可指定 ACL,例如:

user:tom:rw-,mask:rwx,group:staff:r-x
NFSv4 ACL 规范(由 NFSv4 和 ZFS 支持)

NFSv4 ACL 可提供更丰富的 ACL 语义。这种规范可提供允许和拒绝条目、更精细的权限和增强的继承控制。

NFSv4 ACL 指定为以下冒号 (:) 分隔字段。

owner@:<perms>[:inheritance flags]:<allow|deny>

文件所有者的权限。

group@:<perms>[:inheritance flags]:<allow|deny>

文件组成员的权限。

everyone@:<perms>[:inheritance flags]:<allow|deny>

所有人(包括文件所有者和组成员)的权限。

user:<username>:<perms>[:inheritance flags]:<allow|deny>

特定用户的权限。

usersid:<sid string>:<perms>[:inheritance flags]:<allow|deny>

特定用户的权限,但是用户由 SID 指定。

group:<groupname>:<perms>[:inheritance flags]:<allow|deny>

特定组的权限。

groupsid:<sid string>:<perms>[:inheritance flags]:<allow|deny>

特定组的权限,但是组由 SID 指定。

sid:<sid string>:<perms>[:inheritance flags]:<allow|deny>

特定 SID 的权限,但是 SID 是用户还是组无关紧要。

可采用三种不同 chmod ACL 格式指定权限:详细、紧凑或位置。详细格式使用字词指示用正斜杠 (/) 字符分隔权限。紧凑格式使用权限字母标识权限,位置格式使用权限字母标识权限,或使用连字符 (-) 标识没有任何权限。

详细模式的权限以及其括号中的缩写形式(紧凑和位置模式)如下所述:

read_data (r)

读取文件数据的权限。

list_directory (r)

列出目录内容的权限。

write_data (w)

在文件的偏移范围内任意位置修改文件数据的权限。

add_file (w)

向目录中添加新文件的权限。

append_data (p)

修改文件数据的能力,但仅从 EOF 开始。

当前不支持此权限。

add_subdirectory (p)

在目录中创建子目录的权限。

read_xattr (R)

读取文件扩展属性的能力。

write_xattr (W)

创建扩展属性或向扩展属性目录写入的能力。

execute (x)

执行文件的权限。

read_attributes (a)

读取文件的基本属性(非 ACL)的能力。

write_attributes (A)

将与文件或目录关联的时间更改为任意值的权限。

delete (d)

删除文件的权限。

有关删除权限行为的更多信息,请参见在 Oracle Solaris 11.2 中管理 ZFS 文件系统

delete_child (D)

删除目录中的文件的权限。

有关删除权限行为的更多信息,请参见在 Oracle Solaris 11.2 中管理 ZFS 文件系统

read_acl (c)

读取文件 ACL 的权限。

write_acl (C)

写入文件 ACL 的权限。

write_owner (o)

更改文件所有者的权限。

synchronize (s)

在支持同步读写的服务器上本地访问文件的权限。

当前不支持此权限。

使用紧凑 ACL 格式时,将通过使用指示权限的 14 个唯一字母来指定权限。

使用位置 ACL 格式时,将权限指定为类似于 ls –V 格式的位置参数。连字符 (-) 指示在该位置未授予任何权限,可以忽略它,只需指定必需的字母。

将按照位置表示法中指定的顺序列出上面的字母。

使用这些字母指定权限的方式如下:

rwx--D--------

可以删除连字符,按如下方式压缩字符串:

rwxD

还支持多个特殊权限集或别名。以下权限集的使用方式与指定详细权限的方式相同。

full_set

所有权限。

modify_set

write_aclwrite_owner 以外的所有权限。

read_set

read_data、read_acl、read_attributesread_xattr

write_set

write_data、append_data、write_attributeswrite_xattr

可以采用三种格式指定可选继承标志。第一种格式使用字词指明各种继承标志,以正斜杠 (/) 字符分隔不同的标志。

file_inherit (f)

继承到所有新创建的文件。

dir_inherit (d)

继承到所有新创建的目录。

inherit_only (i)

如果放置到某个目录上,不应用于该目录,仅继承到新创建的文件和目录。该标志要求还要指定 file_inherit 和/或 dir_inherit

no_propagate (n)

表示 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 采用以下几种格式之一:

a

设置与当前文件关联的所有布尔读写扩展系统属性。

c[compact_attribute_list]
c'{'compact_attribute_list'}'

设置由 compact_attribute_list 标识的每个布尔读写扩展系统属性。

v[verbose_attribute_setting]
v['{'verbose_attribute_setting_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 中指定了多次,将应用最后一次指定的运算。

以下是属性名称和缩写字符列表:

属性名称

缩写字符

hidden

H

sparse

s

system

S

readonly

R

archive

A

nounlink

u

immutable

i

appendonly

a

nodump

d

av_quarantined

q

av_modified

m

sensitive

T

选项

支持以下选项:

–f

强制。如果无法更改文件模式,chmod 不会报告错误。

–R

向下递归目录参数,在此过程中设置每个文件的模式。如果遇到符号链接,将更改目标文件的模式,但是不执行递归。

–@ named_attribute

对每个文件操作数的指定扩展属性文件而非文件操作数本身执行属性运算。如果提供了多项 –@ 运算,属性规范模式将应用于每个指定的属性文件。

* 的指定属性会将含义转至 chmod,该命令将认为表示与文件操作数关联的所有扩展属性文件。这不适用于特殊文件 ...

.. 的指定属性会将特殊含义转至 chmod,该命令将认为表示文件操作数本身。这样,调用一次 chmod 即可将属性规范模式应用于文件操作数的指定属性文件和文件操作数本身。

操作数

支持下列操作数:

absolute-mode
symbolic-mode-list

表示将对 file 操作数之一指定的每个文件的文件模式位做出的更改。有关更多信息,请参见本手册页“描述”部分中的“绝对模式”和“符号模式”。

acl_operation

表示要对文件 ACL 执行的修改。有关更多信息,请参见“描述”部分中的“ACL 运算”。

acl_operation 采用以下几种格式之一:


A[number] -
A-acl_specification
A[index]{+|=}acl_specification 
attribute_specification_list

表示要对文件属性执行的修改。有关更多信息,请参见本手册页“描述”部分中的“属性运算”。

file

要修改其文件模式位的文件的路径名。

用法

有关 chmod 遇到大于或等于 2 GB(231 字节)文件时行为的说明,请参见 largefile(5)

示例

示例 1 拒绝执行权限

以下示例将拒绝所有人的执行权限:

% 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 的以下系统属性:archivehiddenreadonlysystemappendonlyimmutablenounlink。假设具有相应的特权,则将清除 file1 的以下系统属性:nodumpav_modifiedav_quarantinedsensitive

示例 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 文件的 hiddensystem 系统属性

以下示例将设置 ZFS 文件的 hiddensystem 系统属性:


$ 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

假设具有相应的特权,并且 file1file2 支持的系统属性相同,则为 file1 设置的所有系统属性也会为 file2 设置。为 file1 清除的所有系统属性也会为 file2 清除。

环境变量

有关影响 chmod 执行的以下环境变量的描述,请参见 environ(5):LANG、LC_ALL、LC_CTYPE、LC_MESSAGES 和 NLSPATH。

退出状态

将返回以下退出值:

0

成功完成。

>0

出现错误。

属性

有关下列属性的说明,请参见 attributes(5)

属性类型
属性值
可用性
system/core-os
CSI
Enabled(已启用)
接口稳定性
Committed(已确定)

另请参见

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+sg-s

chmod 允许生成无用的模式,前提是这些模式不违法(例如,使文本文件成为可执行文件)。chmod 不会检查文件类型来查看强制性锁定是否有意义。

如果是使用 nosuid 选项挂载的文件系统,则不允许 setuid 执行。

如果使用 chmod 更改包含 ACL 条目的文件的文件组所有者权限,则会同时将文件组所有者权限和 ACL 掩码更改为新的权限。请注意,对于文件中有其 ACL 条目的附加用户和组,新的 ACL 掩码权限可能会更改其有效权限。使用 getfacl(1)ls(1) 命令可确保为所有 ACL 条目设置相应的权限。