Ruby:如何从/var/db/group.db访问组信息

Ruby:如何从/var/db/group.db访问组信息,ruby,linux,irb,centos8,Ruby,Linux,Irb,Centos8,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/文件系统。不过分 有没有一种简单的方法可以访问/var/DB中的Berkley DB信息,或者我必须遍历/us

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/
文件系统。不过分


有没有一种简单的方法可以访问
/var/DB
中的Berkley DB信息,或者我必须遍历
/usr/local/etc/group
文件才能获得这些信息?

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

您可以使用
strace
确认此怀疑

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

  • :获取下一个组条目
  • :停止迭代组
  • :重置迭代
以下是用于比较的POSIX函数:

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

因此,如果您有(例如)一个
uid
,并且想知道它属于哪些组,您需要首先获取它的名称,然后搜索这些组。不幸的是,提供的迭代器包装器似乎不支持不提供块会返回
枚举器的常见习惯用法,因此您必须自己创建一个

require'etc'
uid=0#例如
username=Etc.getpwuid(uid).name
groups=Etc.enum_for(:group)。选择{| group | group.mem.include?(用户名)}
p群