【问题标题】:Ruby: how to access group info from /var/db/group.dbRuby:如何从 /var/db/group.db 访问组信息
【发布时间】:2021-01-13 14:31:15
【问题描述】:

RHEL/CentOS 8.x、Ruby 2.5.5、irb 0.9.6

我们有一个专门的设置将用户和组信息保存在/usr/local/etc/[user|group] 和一个自定义 Makefile 以相应地将该信息添加到 /var/db/[group|passwd].db

我正在尝试在登录后在 Ruby 中获取用户所属的组列表。

我对这门语言比较陌生,刚刚阅读了Etc module 的文档,但这似乎只适用于/etc/ 文件系统。不离谱。

是否有一种简单的方法可以访问 /var/db 中的 Berkley DB 信息,还是我必须遍历 /usr/local/etc/group 文件才能获取此信息?

【问题讨论】:

    标签: ruby linux irb centos8


    【解决方案1】:

    我怀疑该模块的文档被严重简化、严重过时或两者兼而有之。我几乎 100% 确定 Etc 将使用操作系统提供的标准库函数,而不是自行关闭和解析系统文件。 (为什么 Ruby 开发人员会为他们支持的每个操作系统的配置文件编写解析器,而不是仅仅调用 POSIX 函数?)

    您可以使用strace 确认此怀疑。

    如果您查看 Ruby Etc 模块的结构,它会 1:1 映射到 POSIX 函数:

    以下是用于比较的 POSIX 函数:

    endgrent, getgrent, setgrent – group database entry functions

    在我的例子中,我在 macOS(已经有专门的用户处理)上测试它,但此外,我在我的公司笔记本电脑上测试它,这是加入 Microsoft ActiveDirectory 域的 macOS。在/etc/passwd/etc/group 中甚至都没有提到我的用户帐户及其组,但是,我可以使用Etc 轻松阅读它们。我很确定 Ruby 开发人员没有实现 ActiveDirector 只是为了适应我个人奇怪的用例,所以它必须使用系统函数。

    所以,如果你有例如一个uid,想知道它属于什么组,你需要先得到它的名字,然后搜索组。不幸的是,提供的迭代器包装器似乎不支持不提供块返回 Enumerator 的常见习惯用法,因此您必须自己创建一个。

    require 'etc'
    
    uid = 0 # for example
    
    username = Etc.getpwuid(uid).name
    
    groups = Etc.enum_for(:group).select {|group| group.mem.include?(username) }
    
    p groups
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-11
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 2021-04-12
      相关资源
      最近更新 更多