我们的网站使用 Active Directory,许多组名称都包含空格。这使得即使通过肉眼也无法可靠地解析输出groups
(是否有组“伦敦”和“开发人员”,或者组“伦敦开发人员”?)。
我找不到groups
使用另一个分隔符(换行符或 NUL 即可)或按 GID 列出组的方法。
当某些组名称包含空格时,是否有一种方法可以可靠地获取用户组的列表?
我正在使用 Ubuntu 18.04.3,并且很乐意安装更多软件包,或者编写脚本!
答案1
虽然groups
似乎没有空分隔条目的选项,但至少在适用于 Ubuntu 18.04 1 的id
GNU 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 和实用程序中的变量喜欢groups
或id
处理的事情(perl 会将真实/有效 gid 添加到$(
/前面$)
,但不会删除它从 ) 返回的列表中getgroups(2)
。