

# S3 Files 中的 POSIX 权限
<a name="s3-files-posix-permissions"></a>

POSIX 文件系统要求对每个文件具有所有权和权限。Amazon S3 将数据存储为对象，其访问权限由 IAM 策略和存储桶策略控制，并且不以原生方式存储文件所有权或权限属性。S3 Files 通过将 POSIX 元数据（包括拥有者、组和文件权限）作为用户定义的元数据存储在每个 S3 对象上，来弥合这种差异。当您通过 S3 Files 创建或修改文件时，该服务会自动写入所有权限元数据。在将对象写入文件系统之外的 S3 存储桶时（例如通过 Amazon S3 控制台、AWS CLI 或 AWS SDK），该对象上不存在 POSIX 元数据。S3 Files 为这些对象分配默认的 `root:root` 所有权值和 `644` 权限，这可让非根用户读取文件但不能写入文件。如果这些默认值符合您的访问要求，则无需执行任何操作。如果应用程序需要，可以覆盖有关这些对象的默认权限。本教程将逐步介绍如何应用自定义权限。

## S3 Files 如何存储 POSIX 元数据
<a name="s3-files-posix-permissions-how-stored"></a>

S3 Files 将 POSIX 信息作为用户定义的元数据存储在每个对象上。以下元数据键控制所有权和权限：


| 元数据键 | 说明 | 示例值 | 
| --- | --- | --- | 
| x-amz-meta-file-owner | POSIX 用户 ID（UID） | 1000 | 
| x-amz-meta-file-group | POSIX 组 ID（GID） | 1000 | 
| x-amz-meta-file-permissions | 文件类型和权限位（八进制） | 0100644 | 

当对象没有 POSIX 元数据时，S3 Files 会应用以下默认值：
+ **文件：**具有 `0644` 权限的 `root:root` 所有权 (`-rw-r--r--`)
+ **目录：**具有 `0755` 权限的 `root:root` 所有权 (`drwxr-xr-x`)

在这些默认值下，所有用户都可以读取文件和遍历目录，但只有拥有者（根）可以写入。默认情况下，文件是不可执行的。

## 在现有对象上设置 POSIX 元数据
<a name="s3-files-posix-permissions-existing-objects"></a>

使用以下过程将 POSIX 所有权和权限应用于存储桶中已存在的对象。

### 步骤 1：确定目标用户的 UID 和 GID
<a name="s3-files-posix-permissions-existing-step1"></a>

在本示例中，目标用户为 `ec2-user`，UID 为 1000：

```
$ id ec2-user
uid=1000(ec2-user) gid=1000(ec2-user) groups=1000(ec2-user)
```

### 步骤 2：使用 copy-object 更新对象元数据
<a name="s3-files-posix-permissions-existing-step2"></a>

`aws s3api copy-object` 命令使用更新的元数据将对象复制到位。将 {{BUCKET\_NAME}} 和 {{OBJECT\_KEY}} 替换为您的值。

`--metadata-directive REPLACE` 选项会替换对象上所有用户定义的元数据。包含 `--content-type` 可以保留对象的内容类型，因为 `REPLACE` 会将其重置为默认值 (`binary/octet-stream`)。如果您使用其它元数据字段，请将其包含在 `--metadata` 参数中。

```
aws s3api copy-object \
    --bucket BUCKET_NAME \
    --key OBJECT_KEY \
    --copy-source BUCKET_NAME/OBJECT_KEY \
    --metadata-directive REPLACE \
    --content-type CONTENT_TYPE \
    --metadata '{"file-owner":"1000", "file-group":"1000", "file-permissions":"0100644"}'
```

### 步骤 3：验证元数据是否已应用
<a name="s3-files-posix-permissions-existing-step3"></a>

运行以下命令以确认元数据：

```
aws s3api head-object --bucket BUCKET_NAME --key OBJECT_KEY
```

响应包含您的 POSIX 元数据：

```
{
    "AcceptRanges": "bytes",
    "LastModified": "Mon, 18 May 2026 14:43:00 GMT",
    "ContentLength": 7214,
    "ETag": "\"abc123...\"",
    "ContentType": "image/png",
    "Metadata": {
        "file-owner": "1000",
        "file-group": "1000",
        "file-permissions": "0100644"
    }
}
```

### 步骤 4：验证 S3 文件系统的权限
<a name="s3-files-posix-permissions-existing-step4"></a>

```
$ ls -ltr /mnt/s3files/
-rw-r--r--. 1 ec2-user ec2-user 7214 May 18 14:43 s3.png
```

该文件现在归 `ec2-user` 所有，不再需要根权限即可访问。

## 为新的上传设置 POSIX 元数据
<a name="s3-files-posix-permissions-new-uploads"></a>

在将对象上传到存储桶时，可以包含 POSIX 元数据。

### 使用 aws s3 cp
<a name="s3-files-posix-permissions-new-uploads-cp"></a>

```
aws s3 cp localfile.txt s3://BUCKET_NAME/localfile.txt \
    --metadata '{"file-owner":"1000", "file-group":"1000", "file-permissions":"0100644"}'
```

### 使用 aws s3api put-object
<a name="s3-files-posix-permissions-new-uploads-put"></a>

```
aws s3api put-object \
    --bucket BUCKET_NAME \
    --key localfile.txt \
    --body localfile.txt \
    --metadata '{"file-owner":"1000", "file-group":"1000", "file-permissions":"0100644"}'
```

### 验证已上传对象上的元数据
<a name="s3-files-posix-permissions-new-uploads-verify"></a>

```
aws s3api head-object --bucket BUCKET_NAME --key localfile.txt
```

## 权限值参考
<a name="s3-files-posix-permissions-reference"></a>

下表列出了常见的 POSIX 权限值及其使用案例。


| 八进制值 | 文件模式 | 使用案例 | 
| --- | --- | --- | 
| 0100644 | -rw-r--r-- | 标准文件：拥有者读/写，其他用户只读 | 
| 0100664 | -rw-rw-r-- | 共享文件：拥有者和组读/写，其他用户只读 | 
| 0100755 | -rwxr-xr-x | 可执行：拥有者完全访问，其他用户读取和执行 | 
| 0100666 | -rw-rw-rw- | 全局可写文件：所有用户都可以读写 | 
| 0040755 | drwxr-xr-x | 标准目录：拥有者完全访问，其他用户读取和遍历 | 

## 最佳实践
<a name="s3-files-posix-permissions-best-practices"></a>

尽可能通过 S3 文件系统上传文件。S3 Files 会自动将文件的所有权和权限存储为对象元数据，因此无需执行额外的步骤。当直接上传到 S3 存储桶时，请在上传命令中包含 POSIX 元数据，以确保从一开始就设置正确的所有权和权限。