Linux에서 그룹의 모든 구성원을 나열하려면 어떻게해야합니까?
답변
불행히도, 내가 아는 좋은 휴대용 방법은 없습니다. 다른 사람들이 제안한 것처럼 / etc / group을 구문 분석하려고하면 해당 그룹을 기본 그룹으로 사용하는 사용자와 UNIX 플랫 파일 이외의 메커니즘을 통해 해당 그룹에 추가 된 사용자 (예 : LDAP, NIS, pam-pgsql 등).
내가 이것을 직접해야한다면, 아마도 역순으로 할 것입니다 : id
시스템의 모든 사용자 그룹을 가져 와서 (NSS에 모든 소스를 표시 할 것입니다) Perl 또는 비슷한 것을 사용하여 해시를 유지하십시오 각 그룹의 테이블은 해당 사용자의 멤버쉽을 발견했습니다.
편집 : 물론 이것은 시스템의 모든 사용자 목록을 얻는 방법과 비슷한 문제가 있습니다. 내 위치는 플랫 파일과 LDAP 만 사용하므로 두 위치 모두에서 목록을 얻을 수 있지만 사용자 환경에 맞지 않을 수도 있습니다.
편집 2 : 전달 중 누군가 getent passwd
LDAP / NIS 등의 사용자를 포함하여 시스템의 모든 사용자 목록을 반환 하지만 getent group
여전히 기본 그룹 항목을 통해서만 구성원 인 사용자를 그리워한다는 사실을 상기시켜주었습니다. 이 빠른 해킹을 작성하십시오.
#!/usr/bin/perl -T
#
# Lists members of all groups, or optionally just the group
# specified on the command line
#
# Copyright © 2010-2013 by Zed Pobre (zed@debian.org or zed@resonant.org)
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
use strict; use warnings;
$ENV{"PATH"} = "/usr/bin:/bin";
my $wantedgroup = shift;
my %groupmembers;
my $usertext = `getent passwd`;
my @users = $usertext =~ /^([a-zA-Z0-9_-]+):/gm;
foreach my $userid (@users)
{
my $usergrouptext = `id -Gn $userid`;
my @grouplist = split(' ',$usergrouptext);
foreach my $group (@grouplist)
{
$groupmembers{$group}->{$userid} = 1;
}
}
if($wantedgroup)
{
print_group_members($wantedgroup);
}
else
{
foreach my $group (sort keys %groupmembers)
{
print "Group ",$group," has the following members:\n";
print_group_members($group);
print "\n";
}
}
sub print_group_members
{
my ($group) = @_;
return unless $group;
foreach my $member (sort keys %{$groupmembers{$group}})
{
print $member,"\n";
}
}
답변
getent group <groupname>;
Linux 및 Solaris 모두에서 이식 가능하며 로컬 그룹 / 암호 파일, NIS 및 LDAP 구성과 함께 작동합니다.
답변
Python을 사용하여 그룹 멤버를 나열하십시오.
python -c “import grp; print grp.getgrnam ( ‘GROUP_NAME’) [3]”
https://docs.python.org/2/library/grp.html을 참조 하십시오
답변
lid -g groupname | cut -f1 -d'('
답변
다음 명령은에 속하는 모든 사용자를 나열 <your_group_name>
하지만 /etc/group
LDAP, NIS 등이 아닌 데이터베이스로 관리되는 사용자 만 나열합니다 . 또한 보조 그룹에 대해서만 작동 하며 기본 그룹이 기본 그룹으로 설정되어 있으므로 해당 그룹을 기본으로 설정 한 사용자는 나열하지 않습니다. GID
파일에 (숫자 그룹 ID) 로 저장됩니다 /etc/passwd
.
grep <your_group_name> /etc/group
답변
다음 명령은에 속하는 모든 사용자를 나열 <your_group_name>
하지만 /etc/group
LDAP, NIS 등이 아닌 데이터베이스로 관리되는 사용자 만 나열합니다 . 또한 보조 그룹에 대해서만 작동 하며 기본 그룹이 기본 그룹으로 설정되어 있으므로 해당 그룹을 기본으로 설정 한 사용자는 나열하지 않습니다. GID
파일에 (숫자 그룹 ID) 로 저장됩니다 /etc/passwd
.
awk -F: '/^groupname/ {print $4;}' /etc/group
답변
다음 쉘 스크립트는 모든 사용자를 반복하고 지정된 그룹에 속하는 사용자 이름 만 인쇄합니다.
#!/usr/bin/env bash
getent passwd | while IFS=: read name trash
do
groups $name 2>/dev/null | cut -f2 -d: | grep -i -q -w "$1" && echo $name
done
true
사용 예 :
./script 'DOMAIN+Group Name'
참고 : 사용자 및 그룹 (뿐만 아니라위한 NIS 및 LDAP을 확인합니다이 솔루션 passwd
및 group
파일). 또한 그룹에 추가되지 않고 그룹이 기본 그룹으로 설정된 사용자를 고려합니다.
편집 : 사용자가 같은 이름을 가진 그룹에 속하지 않는 드문 시나리오에 대한 수정 사항이 추가되었습니다.
편집 : 쉘 스크립트의 형태로 작성; @Max Chernyak aka hakunin이 제안한 상태로 true
종료하도록 추가되었습니다 . 가끔 건너 뛰기 위해 버려졌습니다 .0
stderr
groups: cannot find name for group ID xxxxxx