当用户的名称包含空格时,如何列出用户的组?

当用户的名称包含空格时,如何列出用户的组?

我们的网站使用 Active Directory,许多组名称都包含空格。这使得即使通过肉眼也无法可靠地解析输出groups(是否有组“伦敦”和“开发人员”,或者组“伦敦开发人员”?)。

我找不到groups使用另一个分隔符(换行符或 NUL 即可)或按 GID 列出组的方法。

当某些组名称包含空格时,是否有一种方法可以可靠地获取用户组的列表?

我正在使用 Ubuntu 18.04.3,并且很乐意安装更多软件包,或者编写脚本!

答案1

虽然groups似乎没有空分隔条目的选项,但至少在适用于 Ubuntu 18.04 1 的idGNU CoreUtils 实现中确实如此

   -z, --zero
          delimit entries with NUL characters, not whitespace;

例如

id -Gnz someuser

应该给出 的补充组名称的空分隔列表someuser- 您可以使用以下命令检查情况

id -Gnz someuser | xargs -0 printf '%s\n'

1请注意,POSIX 不强制使用此选项,因此它不可移植。参见示例The Open Group 基本规格

答案2

在既没有 coreutils 也没有 perl 的系统上,但至少 AD 管理员使用既不包含逗号也不包含括号的正常组名称,可以解析以下输出id

#!/usr/bin/env bash

list_of_groups="$(id | sed 's/^.* groups=//')"
one_group=

while [[ "$list_of_groups" != "$one_group" ]]
do {
        one_group="${list_of_groups%%,*}"
        list_of_groups="${list_of_groups#*),}"
        echo $one_group
} done |
sed -e 's/^[0-9]*(//' -e 's/)$//'

答案3

在没有 GNU coreutils 的系统上,您可以在 perl 中执行相同的操作

perl -le 'print((getgrgid $_)[0]) for split " ", $)'

getegid(2)类似地,在任何提供、getgroups(2)和标准接口绑定的语言中getgrgid(3)

请注意,getgroups(2)可能会也可能不会返回列表中进程的有效 gid ——这是$)perl 和实用程序中的变量喜欢groupsid处理的事情(perl 会将真实/有效 gid 添加到$(/前面$),但不会删除它从 ) 返回的列表中getgroups(2)

相关内容