#访问控制 #acl #文件访问 #访问 #控制

exacl

在 macOS、Linux 和 FreeBSD 上操作文件系统访问控制列表 (ACL)

11 个重大版本发布

0.12.0 2024 年 2 月 3 日
0.11.0 2023 年 9 月 25 日
0.10.0 2023 年 1 月 3 日
0.9.0 2022 年 6 月 9 日
0.2.0 2020 年 12 月 22 日

50文件系统

Download history 4108/week @ 2024-04-23 4979/week @ 2024-04-30 3085/week @ 2024-05-07 3721/week @ 2024-05-14 4021/week @ 2024-05-21 2746/week @ 2024-05-28 3353/week @ 2024-06-04 3606/week @ 2024-06-11 4079/week @ 2024-06-18 5151/week @ 2024-06-25 5029/week @ 2024-07-02 3160/week @ 2024-07-09 3286/week @ 2024-07-16 5739/week @ 2024-07-23 4329/week @ 2024-07-30 3729/week @ 2024-08-06

17,651 每月下载量
用于 7 个 Crates (6 直接)

MIT 许可证

235KB
5.5K SLoC

Exacl

CRATE API CI BUILD COV

Rust 库,用于在 macOS、Linux 和 FreeBSD 上操作文件系统访问控制列表 (ACL)。

示例

use exacl::{getfacl, setfacl, AclEntry, Perm};

// Get the ACL from "./tmp/foo".
let mut acl = getfacl("./tmp/foo", None)?;

// Print the contents of the ACL.
for entry in &acl {
    println!("{entry}");
}

// Add an ACL entry to the end.
acl.push(AclEntry::allow_user("some_user", Perm::READ, None));

// Set the ACL for "./tmp/foo".
setfacl(&["./tmp/foo"], &acl, None)?;

优势

  • 支持 Linux 和 FreeBSD 使用的 POSIX ACL。
  • 支持 macOS 和 FreeBSD/NFSv4 使用的扩展 ACL。
  • 支持以分隔文本格式读取/写入 ACL。
  • 支持 serde(可选)以方便地将 ACL 读取/写入到 JSON、YAML 等常见格式。

API

此模块提供两个高级函数,getfaclsetfacl

  • getfacl 获取文件或目录的 ACL。
  • setfacl 设置文件或目录的 ACL。

在 Linux 和 FreeBSD 上,如果存在,ACL 包含默认 ACL 的条目。

getfaclsetfacl 都与一个 Vec<AclEntry> 一起工作。 AclEntry 结构包含五个字段

  • kind : AclEntryKind - 条目类型(用户、组、其他、掩码或未知)。
  • name : String - 被授予权限的实体的名称。您可以使用用户/组名、十进制 uid/gid 或 UUID(在 macOS 上)。
  • perms : Perm - 条目的权限位。
  • flags : Flag - 标志表示条目是否继承等。
  • allow : bool - 如果条目被允许则为真;如果为假则表示拒绝。Linux 仅支持 allow=true。

更多示例

以下是一些更多示例,展示如何使用此库。

获取以常见分隔字符串格式表示的 ACL

    let acl = exacl::getfacl("/tmp/file", None)?;
    let result = exacl::to_string(&acl)?;

获取以 JSON 格式表示的 ACL

    let acl = exacl::getfacl("/tmp/file", None)?;
    let result = serde_json::to_string(&acl)?;

创建 Linux ACL,允许所有者和组读取/写入文件,但除了 "fred" 之外没有人可以访问。

    let mut acl = exacl::from_mode(0o660);
    acl.push(AclEntry::allow_user("fred", Perm::READ | Perm::WRITE, None));
    exacl::setfacl(&["/tmp/file"], &acl, None)?;

创建 Linux ACL,为所有者和组提供完全访问权限,并为会计组成员提供只读访问权限。创建的任何子目录应自动具有相同的 ACL(通过默认 ACL)。

    let mut acl = exacl::from_mode(0o770);
    acl.push(AclEntry::allow_group(
        "accounting",
        Perm::READ | Perm::EXECUTE,
        None,
    ));

    // Make default_acl a copy of access_acl with the DEFAULT flag set.
    let mut default_acl: Vec<AclEntry> = acl.clone();
    for entry in &mut default_acl {
        entry.flags |= Flag::DEFAULT;
    }
    acl.append(&mut default_acl);
    
    exacl::setfacl(&["./tmp/dir"], &acl, None)?;

构建和测试

在Linux上,您必须安装 libacl1-dev 软件包来构建exacl。集成测试需要 shunit2,可以通过apt或homebrew进行安装。

sudo apt install libacl1-dev shunit2

要运行带有调试日志的单元测试,请输入:RUST_LOG=debug cargo test

要运行集成测试,请输入

cargo test --features serde; ./tests/run_tests.sh

Bindgen功能

如果在您的系统上构建exacl存在问题,请尝试启用bindgen功能。

cargo test --features bindgen

依赖项

~345–710KB
~14K SLoC