

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# AppSpec “权限” 部分（仅限 EC2/本地部署）
<a name="reference-appspec-file-structure-permissions"></a>

该`'permissions'`部分指定了应如何将特殊权限（如果有）应用于文件以及 directories/folders 将文件复制到实例后的`'files'`部分。您可以指定多个 `object` 指令。此部分是可选的。它仅适用于 Amazon Linux、Ubuntu Server 和 RHEL 实例。

**注意**  
`'permissions'` 部分仅用于 EC2/本地部署。它不用于 AWS Lambda 或 Amazon ECS 部署。

此部分具有以下结构：

```
permissions:
  - object: object-specification
    pattern: pattern-specification
    except: exception-specification
    owner: owner-account-name
    group: group-name
    mode: mode-specification
    acls: 
      - acls-specification 
    context:
      user: user-specification
      type: type-specification
      range: range-specification
    type:
      - object-type
```

这些指令如下所示：
+ `object` – 必需。这是一组文件系统对象（文件或目录/文件夹），这些文件系统对象复制到实例之后，将向其应用指定的权限。

  使用字符串指定 `object`。
+ `pattern`：可选。指定权限应用模式。如果未指定或使用特殊字符 **"\$1\$1"** 指定，则权限将应用于所有匹配的文件或目录，具体取决于 `type`。

  使用带引号（""）的字符串指定 `pattern`。
+ `except`：可选。指定对于 `pattern` 而言例外的所有文件或目录。

  使用包含在方括号内的一组逗号分隔的字符串指定 `except`。
+ `owner`：可选。`object` 所有者的名称。如果未指定，则在执行复制操作之后，应用于原始文件或目录/文件夹结构的所有现有所有者将保持不变。

  使用字符串指定 `owner`。
+ `group`：可选。`object` 组的名称。如果未指定，则在执行复制操作之后，应用于原始文件或目录/文件夹结构的所有现有组将保持不变。

  使用字符串指定 `group`。
+ `mode`：可选。一个数值，用于指定要应用于 `object` 的权限。模式设置遵循 Linux chmod 命令语法。
**重要**  
如果该值包含前导零，则必须用双引号将其括起来，或者删除前导零，以便只保留三位数字。
**注意**  
`mode` 设置不支持诸如 **u\$1x** 之类的符号。

  示例：
  + `mode: "0644"` 向对象的所有者授予读写权限（6），为群组授予只读权限（4），向所有其他用户授予只读权限（4）。
  + `mode: 644` 授予与 `mode: "0644"` 相同的权限。
  + `mode: 4755` 设置 setuid 属性（4），向所有者授予完全控制权限（7），向群组授予读取和执行权限（5），并向所有其他用户授予读取和执行权限（5）。

    （有关更多示例，请参阅 Linux chmod 命令文档。）

    如果未指定 mode，则在执行复制操作之后，应用于原始文件或文件夹结构的所有现有模式将保持不变。
+ `acls`：可选。一个字符串列表，表示应用于 `object` 的一个或多个访问控制列表（ACL）条目。例如，**u:bob:rw** 代表用户 **bob** 的读写权限。（有关更多示例，请参阅 Linux `setfacl` 命令文档中的 ACL 条目格式示例。） 您可以指定多个 ACL 条目。如果未指定，`acls`则在执行复制操作后， ACLs 应用于原始文件或 directory/folder 结构的任何现有文件或结构将保持不变。它们取代了任何现有 ACLs的。

  使用短划线（-）后跟空格和字符串的形式指定 `acls`（例如，`- u:jane:rw`）。如果您有多个 ACL，每个 ACL 在单独的行中指定。
**注意**  
设置未命名的用户、未命名的群组或其他类似的 ACL 条目会导致 AppSpec 文件失败。可改用 `mode` 指定这些类型的权限。
+ `context`：可选。对于启用了安全增强型 Linux (SELinux) 的实例，将列出要应用于复制对象的安全相关上下文标签。标签被指定为包含 `user`、`type` 和 `range` 的关键字。（有关更多信息，请参阅 SELinux 文档。） 每个关键字使用一个字符串输入。如果未指定，则在执行复制操作后，应用于原始文件或 directory/folder 结构的所有现有标签将保持不变。
  + `user`：可选。 SELinux 用户。
  + `type`：可选。 SELinux 类型名称。
  + `range`：可选。 SELinux 范围说明符。这在计算机上启用 Multi-Level Security（MLS）和 Multi-Category Security（MCS）之后才生效。如果未启用，则 `range` 默认为 **s0**。

  使用字符串指定 `context`（例如， `user: unconfined_u`）。每个 `context` 在单独的行中指定。
+ `type`：可选。将指定权限应用到的对象类型。`type` 是可设置为 **file** 或 **directory** 的字符串。如果指定了 **file**，则在执行复制操作之后，权限将仅应用于 `object` 中直接包含的文件（不应用于 `object` 自身）。如果**directory**指定，则权限将递归地应用于复制操作`object`后任何位置的所有 directories/folders 内容（但不适用于其`object`本身）。

  使用短划线（-）后跟空格和字符串的形式指定 `type`（例如，`- file`）。

## “Permissions”部分示例
<a name="reference-appspec-file-structure-permissions-example"></a>

以下示例显示了如何使用 `object`、`pattern`、`except`、`owner`、`mode` 和 `type` 指令来指定 `'permissions'` 部分。此示例仅适用于 Amazon Linux、Ubuntu Server 和 RHEL 实例。在此示例中，假设以下文件和文件夹按此层次结构复制到实例：

```
/tmp
  `-- my-app
       |-- my-file-1.txt
       |-- my-file-2.txt
       |-- my-file-3.txt
       |-- my-folder-1
       |     |-- my-file-4.txt
       |     |-- my-file-5.txt
       |     `-- my-file-6.txt
       `-- my-folder-2
             |-- my-file-7.txt
             |-- my-file-8.txt
             |-- my-file-9.txt
	           `-- my-folder-3
```

以下 AppSpec 文件显示了如何在复制这些文件和文件夹后对其设置权限：

```
version: 0.0
os: linux
# Copy over all of the folders and files with the permissions they
#  were originally assigned.
files:
  - source: ./my-file-1.txt
    destination: /tmp/my-app
  - source: ./my-file-2.txt
    destination: /tmp/my-app
  - source: ./my-file-3.txt
    destination: /tmp/my-app
  - source: ./my-folder-1
    destination: /tmp/my-app/my-folder-1
  - source: ./my-folder-2
    destination: /tmp/my-app/my-folder-2
# 1) For all of the files in the /tmp/my-app folder ending in -3.txt
#  (for example, just my-file-3.txt), owner = adm, group = wheel, and
#  mode = 464 (-r--rw-r--).
permissions:
  - object: /tmp/my-app
    pattern: "*-3.txt"
    owner: adm
    group: wheel
    mode: 464
    type:
      - file
# 2) For all of the files ending in .txt in the /tmp/my-app
#  folder, but not for the file my-file-3.txt (for example,
#  just my-file-1.txt and my-file-2.txt),
#  owner = ec2-user and mode = 444 (-r--r--r--).
  - object: /tmp/my-app
    pattern: "*.txt"
    except: [my-file-3.txt]
    owner: ec2-user
    mode: 444
    type:
      - file
# 3) For all the files in the /tmp/my-app/my-folder-1 folder except
#  for my-file-4.txt and my-file-5.txt, (for example,
#  just my-file-6.txt), owner = operator and mode = 646 (-rw-r--rw-).
  - object: /tmp/my-app/my-folder-1
    pattern: "**"
    except: [my-file-4.txt, my-file-5.txt]
    owner: operator
    mode: 646
    type:
      - file
# 4) For all of the files that are immediately under
#  the /tmp/my-app/my-folder-2 folder except for my-file-8.txt,
#  (for example, just my-file-7.txt and
#  my-file-9.txt), owner = ec2-user and mode = 777 (-rwxrwxrwx).
  - object: /tmp/my-app/my-folder-2
    pattern: "**"
    except: [my-file-8.txt]
    owner: ec2-user
    mode: 777
    type:
      - file
# 5) For all folders at any level under /tmp/my-app that contain
#  the name my-folder but not
#  /tmp/my-app/my-folder-2/my-folder-3 (for example, just
#  /tmp/my-app/my-folder-1 and /tmp/my-app/my-folder-2),
#  owner = ec2-user and mode = 555 (dr-xr-xr-x).
  - object: /tmp/my-app
    pattern: "*my-folder*"
    except: [tmp/my-app/my-folder-2/my-folder-3]
    owner: ec2-user
    mode: 555
    type:
      - directory
# 6) For the folder /tmp/my-app/my-folder-2/my-folder-3,
#  group = wheel and mode = 564 (dr-xrw-r--).
  - object: /tmp/my-app/my-folder-2/my-folder-3
    group: wheel
    mode: 564
    type:
      - directory
```

生成的权限如下所示：

```
-r--r--r-- ec2-user root  my-file-1.txt
-r--r--r-- ec2-user root  my-file-2.txt
-r--rw-r-- adm      wheel my-file-3.txt

dr-xr-xr-x ec2-user root  my-folder-1
-rw-r--r-- root     root  my-file-4.txt
-rw-r--r-- root     root  my-file-5.txt
-rw-r--rw- operator root  my-file-6.txt

dr-xr-xr-x ec2-user root  my-folder-2
-rwxrwxrwx ec2-user root  my-file-7.txt
-rw-r--r-- root     root  my-file-8.txt
-rwxrwxrwx ec2-user root  my-file-9.txt

dr-xrw-r-- root     wheel my-folder-3
```

以下示例显示了如何通过添加 `acls` 和 `context` 指令来指定 `'permissions'` 部分。此示例仅适用于 Amazon Linux、Ubuntu Server 和 RHEL 实例。

```
permissions:
  - object: /var/www/html/WordPress
    pattern: "**"
    except: [/var/www/html/WordPress/ReadMe.txt]
    owner: bob
    group: writers
    mode: 644
    acls: 
      - u:mary:rw
      - u:sam:rw
      - m::rw
    context:
      user: unconfined_u
      type: httpd_sys_content_t
      range: s0
    type:
      - file
```