우리 웹사이트는 Active Directory를 사용하며 많은 그룹 이름에 공백이 포함되어 있습니다. 이로 인해 육안으로도 출력을 안정적으로 구문 분석하는 것이 불가능합니다 groups
("London" 및 "Developers" 그룹이 있습니까, 아니면 "London Developers" 그룹이 있습니까?).
groups
다른 구분 기호(개행 또는 NUL이 사용함)를 사용하거나 GID별로 그룹을 나열하는 방법을 찾을 수 없습니다 .
일부 그룹 이름에 공백이 포함된 경우 사용자 그룹 목록을 안정적으로 가져올 수 있는 방법이 있습니까?
저는 Ubuntu 18.04.3을 사용하고 있으며 더 많은 패키지를 설치하거나 스크립트를 작성하고 싶습니다!
답변1
groups
null로 구분된 항목에 대한 옵션은 없는 것 같지만 적어도 Ubuntu 18.04 1id
의 GNU CoreUtils 구현에서는 그렇습니다.
-z, --zero
delimit entries with NUL characters, not whitespace;
예를 들어
id -Gnz someuser
제공되어야 하는 보충 그룹 이름의 비어 있고 구분된 목록 someuser
- 다음을 사용하여 상황을 확인할 수 있습니다.
id -Gnz someuser | xargs -0 printf '%s\n'
1POSIX 는 이 옵션을 요구하지 않으므로 이식성이 없습니다. 예시 보기오픈 그룹 기본 사양
답변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 및 유틸리티의 변수가 처리하는 것입니다 ( $)
perl groups
은 id
실제/유효한 gid를 $(
/ 앞에 추가 $)
하지만 반환된 목록에서 제거하지는 않습니다). ) getgroups(2)
.