Linux에서 그룹에 속한 사용자를 어떻게 알 수 있습니까?


68

최근에 새 사용자를 만들어 특정 그룹에 할당했습니다. 특정 그룹에 할당 된 모든 사용자를 표시하는 명령이 있는지 궁금합니다. 나는 'groups'명령을 사용하려고 시도했지만 이것을 사용할 때마다 'groups : not found'라고 표시됩니다.


3
이것이 groups명령입니다. coreutils의 일부이기 때문에 Linux에는 없을 것입니다.
Thomas Dickey

@ThomasDickey 그러나 일부 NAS에서와 같이 가능합니다.
토마스 W.

답변:


43

grep을 사용할 수 있습니다 :

grep '^group_name_here:' /etc/group

여기에는이 그룹을 기본 그룹으로 사용하는 사용자가 아닌 보충 그룹 구성원 만 표시됩니다. 그리고 LDAP와 같은 네트워크 서비스의 그룹이 아닌 로컬 그룹 만 찾습니다.


6
중앙 인증에서는 작동하지 않습니다.
Maxim Egorushkin

1
이는 1 차 / 2 차 차이로 인해 실제로 혼동 될 수 있습니다. 나는 sudo lid -g {group}이 답변이 그룹에 8 명의 사용자를 sudo lid -g {group}나열하고 10을 나열하는 시스템을 가지고 있다고 생각한다 .
DKroot

getent아래에서 @Murray Jensen의 답변 보기
scrutari

84

getent 명령 을 사용하는 것을 선호합니다 ...

getent는 시스템과 동일한 이름 서비스를 사용하므로 getent는 LDAP와 같은 네트워크 정보 소스에서 얻은 정보를 포함하여 모든 정보를 표시합니다.

따라서 그룹의 경우 다음을 사용해야합니다 ...

getent group name_of_group

여기서 name_of_group 은 조회하려는 그룹으로 바뀝니다. 이는 보조 그룹 멤버쉽 만 리턴하며이 그룹을 기본 그룹으로 사용하는 사용자는 포함하지 않습니다.

당신이 할 수있는 다른 많은 룩업이 있습니다 ... passwd또 다른 유용한 것입니다.


1
관리자가 아니고 그룹 정보가 다른 서버에 저장된 경우 다른 답변이 적용되지 않습니다.
Andrés Alcarraz

1
이는 1 차 / 2 차 차이로 인해 실제로 혼동 될 수 있습니다. 나는 sudo lid -g {group}이 답변이 그룹에 8 명의 사용자를 sudo lid -g {group}나열하고 10을 나열하는 시스템을 가지고 있다고 생각한다 .
DKroot

12

보다 쉬운 groups [username]

모든 로컬 사용자 및 해당 로컬 그룹을 나열하려면 다음을 수행하십시오.

cat /etc/passwd | awk -F':' '{ print $1}' | xargs -n1 groups

"그룹 : 명령을 찾을 수 없음"이 표시되면 경로를 재설정하기 위해 환경 경로를 더 나쁘게 편집했을 수 있습니다. PATH=$(getconf PATH)


이 경우 특정 그룹에 대한 작업 | grep {group}추가되고는 달리 정답을 제공 getent group name_of_group또는grep '^group_name_here:' /etc/group
DKroot

1
대신 nis / ldap의 사용자가 계속 나열되도록 cat /etc/passwd사용해야합니다 gentent passwd. 유일한 단점은 꽤 오랜 시간이 걸릴 수 있다는 것입니다.
브라이언 민턴

8
groupmems -g 그룹 이름 -l

명명 된 그룹의 모든 사용자를 나열합니다.


즉 참고 groupmems그러나, 대부분의 리눅스 배포판에 사용되는 그림자 유틸의 일부입니다 groupmems현재 (데비안 결석 및 파생 버그 2016년 11월)의 등 (현재 고정하지만 아직 릴리스에 포함되지 않음)
스테판 Chazelas가

2
또한 LDAP 또는 다른 사용자 데이터베이스의 groupmems그룹이 /etc/group아닌 그룹 만 처리하며 / etc / gshadow를 열려고 할 때 수퍼 유저 권한이 필요합니다.
Stéphane Chazelas

위에서 언급 한 경고에도 불구하고이 명령은 출력 (즉 cut, 친구) 의 추가 구문 분석이 필요하지 않으므로 특정 상황에 이상적입니다 .
bonh

이는 1 차 / 2 차 차이로 인해 실제로 혼동 될 수 있습니다. 나는 이것을 피하기 위해 피해야한다고 생각한다 sudo lid -g {group}. 이 답변에 그룹에 8 명의 사용자를 sudo lid -g {group}나열하고 10을 나열하는 시스템이 있습니다 .
DKroot

5

나는 아무도 언급하지 않은 것에 놀랐다

id <user>

이 명령은 사용자가 속한 그룹 목록을 제공합니다.


3
제목과는 달리 질문자는 질문에 자세히 설명 된대로 특정 사용자 그룹이 아닌 특정 그룹 내의 사용자를 알고 싶어했습니다. 나는 내용과 일치하도록 제목을 다시 표현했다.
Dubu

아아 질문 텍스트를 더 잘 읽었어야합니다. 감사.
Alex

4

groups명령은 사용자의 그룹 멤버쉽을 인쇄합니다. lid명령을 사용 하여 다음과 같은 그룹의 사용자를 나열 할 수 있습니다 .

# lid -g <groupname>

4
lidlibuser의 일부이며 많은 배포판에서 기본적으로 설치되지 않습니다.
Chris Down

2

OP는 groups 명령 을 사용할 가능성을 배제하기 위해 질문을 표현했습니다 . Linux에서 coreutils의 일부이므로 (a) 제거되었거나 (b) OP가 이름을 잘못 입력했습니다.

groups예를 들어 OP는 다음 과 같이 사용할 수 있습니다 .

for name in $(cut -d: -f1 /etc/passwd);do groups $name|grep -w sudo|awk '{print $1;}';done

하나의 제안 답변은에서 그룹 이름에 대한 grep입니다 /etc/group. 때로는 의도 한대로 작동합니다.

grep을 약간 더 잘 사용하려면 다음 구문을 고려하십시오 /etc/group.

group_name:password:GID:user_list

첫 번째 콜론 부분 만 유효한 그룹 이름이되도록합니다. 구문에 관계없이 일반 grep은 파일에서 잘못된 결과를 가져올 수 있습니다. 정규 표현식을 사용하여 grep이 필요한 것을 정확하게 일치 시키십시오.

grep -E '^users:' /etc/group |sed -e 's/^.*://'

또는 쉘 변수를 사용하는 경우 :

grep -E '^'$groupname':' /etc/group |sed -e 's/^.*://'

그러나 기본 그룹에 없는 항목 만 나열합니다 . 추가하려면 사람들을 , 당신은에서 그룹 ID 번호를 추출하여, 고려 예를 들어, 암호 파일을 취할 필요 /etc/group하고, 그 기본 그룹에서 일치하는 사용자를 인쇄 /etc/passwd예를 들면,

grp=$(awk -F: '$1 ~ /^users$/ {print $3; }' </etc/group)
awk -F: '$4 ~ /^'$grp'$/ { print $1; }' </etc/passwd

grep과 sed를 사용하여 동일한 작업을 수행 할 수 있지만 awk를 사용하는 것보다 더 효과적입니다.

또 다른 제안 답변은을 사용하여 제안 getent했으며 Linux 시스템에도있을 수 있습니다 (Debian에서는 GNU libc의 일부입니다). 그러나 빠른 확인은 /etc/group내용 만 제공한다는 것을 보여줍니다 .

나는 (대부분의 경우처럼) 설치 하지 않았 libusers거나 lid설치되어 있지 않으므로 OP의 조건을 충족시키는 지 여부에 대해서는 언급 할 수 없습니다.

id그룹 정보를 제공 하는 프로그램 도 있습니다 . 누군가가 가능한 대답으로 그것을 확장 할 수 있습니다.


또는 sed -n "s/^$groupname:.*://p" /etc/group그룹 이름에 RE 연산자가 포함 된 경우 (예 .를 들어 그룹 이름에서 일반적이지 않은 경우) 여전히 잘못된 결과를보고 할 수 있습니다 .
Stéphane Chazelas

GNU getent는 LDAP / NIS도 쿼리하지만 그룹 데이터베이스에 대해 열거가 명시 적으로 비활성화되어있는 경우에는 가능하지 않습니다.
Stéphane Chazelas

그주의 groups는 특정 사용자가 특정 그룹의 구성원 목록에 반대의 구성원 인 그룹이 나열으로 도움이되지 것입니다.
Stéphane Chazelas

2

매력처럼 작동합니다.

cut -d: -f1,4 /etc/passwd | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1

@ARG의 허용 된 답변과 달리이 명령은 <groupname>을 기본 그룹으로 사용하는 사용자를 나열합니다.
Bhavik

이것은 정답입니다
Nikolay Nenov

1
동의하지 않습니다. / etc / passwd에서 사용자를 읽으므로 LDAP 등에 액세스하는 다른 nsswitch 모듈에서는 작동하지 않습니다.
Ivan Vučica

나를 위해 올바르게 작동하지 않았다 : 나는 그룹 sudo lid -g8에 반면에 8 명 그룹에 4 명의 회원 이 있습니다. @Bhavik 허용되는 답변도 정확하지 않습니다.
DKroot

2

일부는 libuser ( 'lid') 또는 멤버 ( 'members')를 설치하라는 메시지를 표시합니다. 그러나 로그인 그룹 회원 자격 으로이 문제 를 처리 한 https://unix.stackexchange.com/a/349648/77959 답변을 기반으로 다른 그룹이 해당 스크립트에 포함되지 않는 것으로 나타났습니다. 그래서-두 가지 방법 중 가장 좋은 방법은 다음과 같습니다.

#!/bin/bash
if [ $# -eq 1 ]; then
        list_a=`cut -d: -f1,4 /etc/passwd | grep $(getent group "$1"| cut -d: -f3) | cut -d: -f1`
        list_b=`getent group "$1"|cut -d: -f4|sed 's/,/\n/g'`
        echo -e "$list_a\n$list_b"|grep -v "^$"|sort|uniq
else
        echo "pass me a group to find the members of"
fi

응답 getent이나 grep 과는 달리 내 시스템에서 올바르게 작동했습니다.'^group_name_here:' /etc/group
DKroot

0

이 user3717722 접근 방식의 수정은 NIS 데이터베이스에 그룹 구성원을 나열합니다.

ypcat passwd | cut -d: -f1,4 | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.