2个版本
0.2.1 | 2024年7月25日 |
---|---|
0.2.0 | 2024年7月24日 |
#110 在 操作系统
1,318 每月下载量
19KB
189 行
sudo2
变更日志
对crate karen
进行了以下更改,它是对 sudo
和 elevate
的分叉。
- 添加了对通配符的支持。可以使用
sudo2::with_env_wildcards(&["*"])
选择所有环境变量(模仿sudo -E
)。 - 添加了一些内部函数。
sudo2::running_as_root
如果进程已作为root
运行,则返回true
。 - 添加了
rustfmt.toml
提升权限,并获得root访问权限!
这是 sudo
和 elevate
crate的扩展分叉,它是一个简单的库,用于使用sudo重启进程以提升权限。
这个分叉是对原始版本的重构,以下是一些更改
- 为
Elevate
结构添加了构建器模式 - 可以通过从构建器设置包装器,使用
pkexec
或polkit
作为sudo
的替代品
API是原始 sudo
crate 的超集,因此您可以将其用作直接替换,但您也可以使用新的构建器模式来设置自己的选项(目前仅支持包装器)
原始的 sudo
crate 可以在 GitLab (crates.io) 上找到。
检测您是否以root用户运行,如果需要,则使用sudo
重启,或者在设置SUID标志时设置uid为零。
需求
- 类Unix操作系统
- 目标包装器(sudo、pkexec、polkit)必须已安装并在PATH中。默认为
sudo
。 - 已测试Linux或Mac OS X
- 它应该适用于*BSD。您可能需要在OpenBSD上使用新的构建模式,用
doas
代替sudo
。
- 它应该适用于*BSD。您可能需要在OpenBSD上使用新的构建模式,用
示例
首先,将sudo添加到您的Cargo.toml
[dependencies]
sudo = "0.6.1"
在您的main.rs
中
fn main() -> Result<(), Box<dyn Error>> {
sudo2::escalate_if_needed()?;
println!("Hello, Root-World!");
Ok( () )
}
如果您使用的是基于log基础设施的日志,您将获得带时间戳的格式化输出。
传递RUST_BACKTRACE
如果RUST_BACKTRACE
设置为以下值之一,则该包将自动保留设置
- `` <- 空字符串表示不传递
1
或true
<- 标准跟踪full
<- 完整跟踪
$ RUST_BACKTRACE=full cargo run --example backtrace
2020-07-05 18:10:31,544 TRACE [sudo] Running as User
2020-07-05 18:10:31,544 DEBUG [sudo] Escalating privileges
2020-07-05 18:10:31,544 TRACE [sudo] relaying RUST_BACKTRACE=full
[sudo] Passwort für user:
2020-07-05 18:10:39,238 TRACE [sudo] Running as Root
2020-07-05 18:10:39,238 TRACE [sudo] already running as Root
2020-07-05 18:10:39,238 INFO [backtrace] entering failing_function
thread 'main' panicked at 'now you see me fail', examples/backtrace.rs:16:5
保留部分环境变量
您可以在sudo屏障之间保留部分环境变量。这允许更多的配置选项,通常用于守护进程或云环境
// keeping all environment variables starting with "EXAMPLE_" or "CARGO"
sudo2::with_env(&["EXAMPLE_", "CARGO"]).expect("sudo failed");
警告:如果不受信任的用户能够设置这些变量,这可能会给您的应用程序引入安全风险。
$ EXAMPLE_EXEC='$(ls)' EXAMPLE_BTICKS='`ls`' cargo run --example environment
2020-07-07 16:32:11,261 INFO [environment] ① uid: 1000; euid: 1000;
...
declare -x EXAMPLE_BTICKS="\`ls\`"
declare -x EXAMPLE_EXEC="\$(ls)"
...
[sudo] password for user:
2020-07-07 16:32:11,285 TRACE [sudo] Running as Root
2020-07-07 16:32:11,285 TRACE [sudo] already running as Root
2020-07-07 16:32:11,285 INFO [environment] ② uid: 0; euid: 0;
...
declare -x EXAMPLE_BTICKS="\`ls\`"
declare -x EXAMPLE_EXEC="\$(ls)"
以SUID运行程序
$ cargo run --example suid
2020-04-17 15:13:49,450 INFO [suid] ① uid: 1000; euid: 1000;
uid=1000(user) gid=1000(user) groups=1000(user),4(adm),27(sudo)
2020-04-17 15:13:49,453 TRACE [sudo] Running as User
2020-04-17 15:13:49,453 DEBUG [sudo] Escalating privileges
[sudo] password for user:
2020-04-17 15:13:53,529 INFO [suid] ① uid: 0; euid: 0;
uid=0(root) gid=0(root) groups=0(root)
2020-04-17 15:13:53,532 TRACE [sudo] Running as Root
2020-04-17 15:13:53,532 TRACE [sudo] already running as Root
2020-04-17 15:13:53,532 INFO [suid] ② uid: 0; euid: 0;
uid=0(root) gid=0(root) groups=0(root)
然后将文件给root
并添加suid标志。
$ sudo chown root target/debug/examples/suid
$ sudo chmod 4755 target/debug/examples/suid
现在再次运行程序
$ target/debug/examples/suid
2020-04-17 15:14:37,199 INFO [suid] ① uid: 1000; euid: 0;
uid=1000(user) gid=1000(user) euid=0(root) groups=1000(user),4(adm),27(sudo)
2020-04-17 15:14:37,202 TRACE [sudo] Running as Suid
2020-04-17 15:14:37,202 TRACE [sudo] setuid(0)
2020-04-17 15:14:37,202 INFO [suid] ② uid: 0; euid: 0;
uid=0(root) gid=1000(user) groups=1000(user),4(adm),27(sudo)
依赖项
~330–475KB