#root #running #flags #uid #suid #restart #set

sudo

检测您是否以root身份运行,如有需要,使用sudo重启自身或在设置SUID标志时设置uid为零

9个版本 (重大更新)

0.6.0 2021年1月12日
0.5.0 2020年7月20日
0.4.0 2020年7月5日
0.3.1 2020年4月17日
0.0.0 2019年9月27日

#230开发工具

Download history 7206/week @ 2024-02-28 6700/week @ 2024-03-06 7294/week @ 2024-03-13 6813/week @ 2024-03-20 6107/week @ 2024-03-27 10596/week @ 2024-04-03 12490/week @ 2024-04-10 12688/week @ 2024-04-17 13637/week @ 2024-04-24 8783/week @ 2024-05-01 9129/week @ 2024-05-08 9820/week @ 2024-05-15 9743/week @ 2024-05-22 9970/week @ 2024-05-29 9887/week @ 2024-06-05 5196/week @ 2024-06-12

每月36,240 次下载
38 个crate中使用 (直接使用35个)

MIT/Apache

11KB
97

sudo

crates.io docs.rs

检测您是否以root身份运行,如有需要,使用sudo重启自身或在设置SUID标志时设置uid为零。

要求

  • 需要在目标系统上安装并正确设置sudo程序。
  • 已测试Linux或Mac OS X
    • 它应该在*BSD上工作。然而,尚未进行测试。

示例

首先,将sudo添加到您的Cargo.toml

[dependencies]
sudo = "0.5"

在您的main.rs

fn main() -> Result<(), Box<dyn Error>> {
    sudo::escalate_if_needed()?;
    println!("Hello, Root-World!");
    Ok( () )
}

如果您使用基于log基础设施的日志记录,您将获得带时间戳的格式化输出。

传递RUST_BACKTRACE

如果RUST_BACKTRACE设置为以下值之一,crate将自动保持该设置:

  • `` <- 空字符串表示不传递
  • 1true <- 标准跟踪
  • 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"
    sudo::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)

依赖项

~130KB