8 个版本 (破坏性更新)

0.8.0 2024年5月18日
0.7.0 2024年4月24日
0.6.0 2024年2月17日
0.5.0 2023年8月22日
0.1.0 2019年6月9日

#75数据库接口

Download history 5180/week @ 2024-04-26 6010/week @ 2024-05-03 6262/week @ 2024-05-10 6492/week @ 2024-05-17 7218/week @ 2024-05-24 7226/week @ 2024-05-31 6572/week @ 2024-06-07 5977/week @ 2024-06-14 7354/week @ 2024-06-21 6137/week @ 2024-06-28 7581/week @ 2024-07-05 6953/week @ 2024-07-12 6708/week @ 2024-07-19 6720/week @ 2024-07-26 6492/week @ 2024-08-02 5052/week @ 2024-08-09

每月 26,001 次下载
用于 2 crates

LGPL-3.0

38KB
823

libnss-rs

Rust绑定库,用于创建libnss模块。

目前支持以下数据库

  • passwd
  • shadow
  • group
  • hosts

入门指南

  • 创建一个新的库

    cargo new nss_example --lib
    
  • 在您的 Cargo.toml 中将库类型更改为 cdylib

    [lib]
    name = "nss_example"
    crate-type = [ "cdylib" ]
    

    *** 注意 *** crate的名称本身并不重要,但是库本身必须遵循 nss_xxx 的模式。

  • libnss 添加到您的 Cargo.toml

    [dependencies]
    libc = "0.2.0"
    libnss = "0.8.0"
    
  • 实现passwd数据库

    use libnss::passwd::{PasswdHooks, Passwd};
    use libnss::libnss_passwd_hooks;
    
    struct ExamplePasswd;
    libnss_passwd_hooks!(example, ExamplePasswd);
    

    libnss_passwd_hooks 的第一个参数必须是您最终库的名称 libnss_example.so.2

    impl PasswdHooks for HardcodedPasswd {
        fn get_all_entries() -> Vec<Passwd> {
            vec![
                Passwd {
                    name: "test".to_string(),
                    passwd: "x".to_string(),
                    uid: 1005,
                    gid: 1005,
                    gecos: "Test Account".to_string(),
                    dir: "/home/test".to_string(),
                    shell: "/bin/bash".to_string(),
                }
            ]
        }
    
        fn get_entry_by_uid(uid: libc::uid_t) -> Option<Passwd> {
            if uid == 1005 {
                return Some(Passwd {
                    name: "test".to_string(),
                    passwd: "x".to_string(),
                    uid: 1005,
                    gid: 1005,
                    gecos: "Test Account".to_string(),
                    dir: "/home/test".to_string(),
                    shell: "/bin/bash".to_string(),
                });
            }
    
            None
        }
    
        fn get_entry_by_name(name: String) -> Option<Passwd> {
            if name == "test" {
                return Some(Passwd {
                    name: "test".to_string(),
                    passwd: "x".to_string(),
                    uid: 1005,
                    gid: 1005,
                    gecos: "Test Account".to_string(),
                    dir: "/home/test".to_string(),
                    shell: "/bin/bash".to_string(),
                });
            }
    
            None
        }
    }
    
  • 构建

    cargo build --release
    
  • 安装库

    cd target/release
    cp libnss_example.so libnss_example.so.2
    sudo install -m 0644 libnss_example.so.2 /lib
    sudo /sbin/ldconfig -n /lib /usr/lib
    
  • /etc/nsswitch.conf 中启用您的nss模块,例如

    passwd:         example files systemd
    

    这里的名字必须遵循最终库的名称 libnss_example.so.2

  • 查看示例以获取更多信息

依赖项

~56KB