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 在 文件系统
17,651 每月下载量
用于 7 个 Crates (6 直接)
235KB
5.5K SLoC
Exacl
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
此模块提供两个高级函数,getfacl
和 setfacl
。
getfacl
获取文件或目录的 ACL。setfacl
设置文件或目录的 ACL。
在 Linux 和 FreeBSD 上,如果存在,ACL 包含默认 ACL 的条目。
getfacl
和 setfacl
都与一个 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