Как перечислить всех пользователей в группе Linux?

После прочтения вашей правки кажется, что здесь есть место, где можно шевелиться. Если мы берем 2 маленьких вольности, это можно сделать в одной командной строке. Если нельзя взять одну или обе свободы, дайте мне знать.

Если WMIC не требуется, и если мы можем нацеливать все имеющиеся идентификаторы SID, а не пытаться сопоставить имена с SID, то «reg.exe» и «for» могут сделать это быстро. Вот пример с примером вывода:

(Необязательно) Enum Profiles:

cmd:
for /f "delims=\ tokens=2" %A in ('reg query hku ^| findstr /i "S-1-5-21-" ^| findstr /v /i "_Classes"') do @echo ;[i] Profile Found: {%A}

output:
;[i] Profile Found: {S-1-5-21-277974881-2357464463-7727422770-1001}
;[i] Profile Found: {S-1-5-21-277974881-2357464463-7727422770-1002}
;[i] Profile Found: {S-1-5-21-277974881-2357464463-7727422770-1007}

Добавить ключ + значение

cmd:
for /f "delims=\ tokens=2" %A in ('reg query hku ^| findstr /i "S-1-5-21-" ^| findstr /v /i "_Classes"') do @(reg add "hku\%A\Software\Microsoft\Terminal Server Client\Default\Addins\FooKey" /v FooName /t REG_SZ /d "C:\foo\file\foo.dll" /f >nul 2>&1 && (echo ;[i] Reg Key Added {%A}) || (echo ;[i] Reg Key Failed To Add {%A}))

output:
;[i] Reg Key Added {S-1-5-21-277974881-2357464463-7727422770-1001}
;[i] Reg Key Added {S-1-5-21-277974881-2357464463-7727422770-1002}
;[i] Reg Key Added {S-1-5-21-277974881-2357464463-7727422770-1007}

(Необязательно) Проверка успеха:

cmd:
for /f "delims=\ tokens=2" %A in ('reg query hku ^| findstr /i "S-1-5-21-" ^| findstr /v /i "_Classes"') do @(reg query "hku\%A\Software\Microsoft\Terminal Server Client\Default\Addins\FooKey" /v FooName 2>nul || echo ;[e] Couldn't Find Key {%A})

output:
HKEY_USERS\S-1-5-21-277974881-2357464463-7727422770-1001\Software\Microsoft\Terminal Server Client\Default\Addins\FooKey
    FooName    REG_SZ    C:\foo\file\foo.dll


HKEY_USERS\S-1-5-21-277974881-2357464463-7727422770-1002\Software\Microsoft\Terminal Server Client\Default\Addins\FooKey
    FooName    REG_SZ    C:\foo\file\foo.dll


HKEY_USERS\S-1-5-21-277974881-2357464463-7727422770-1007\Software\Microsoft\Terminal Server Client\Default\Addins\FooKey
    FooName    REG_SZ    C:\foo\file\foo.dll
271
задан ekad 6 January 2018 в 06:11
поделиться

4 ответа

К сожалению, не существует хорошего, переносимого способа сделать это, о котором я знаю. Если вы попытаетесь разобрать /etc/group, как предлагают другие, вы пропустите пользователей, у которых эта группа является основной, и всех, кто был добавлен в эту группу через механизм, отличный от плоских файлов UNIX (т.е. LDAP, NIS, pam-pgsql и т.д.).

Если бы мне пришлось делать это самому, я бы, вероятно, сделал все наоборот: использовал id для получения групп каждого пользователя в системе (что позволит получить все источники, видимые NSS), и использовал Perl или что-то подобное для ведения хэш-таблицы для каждой обнаруженной группы, отмечая членство в ней данного пользователя.

Edit: Конечно, это оставляет вас с похожей проблемой: как получить список всех пользователей в системе. Поскольку в моем месте используются только плоские файлы и LDAP, я могу просто получить список из обоих мест, но это может быть верно или не верно для вашей среды.

Правка 2: Кто-то мимоходом напомнил мне, что getent passwd вернет список всех пользователей в системе, включая пользователей из LDAP/NIS/etc., но 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";
    }
}
102
ответ дан 23 November 2019 в 02:16
поделиться

Вот другая острота Python, которая принимает во внимание состав группы пользователя по умолчанию (от /etc/passwd), а также от базы данных группы (/etc/group)

python -c "import grp,pwd; print set(grp.getgrnam('mysupercoolgroup')[3]).union([u[0] for u in pwd.getpwall() if u.pw_gid == grp.getgrnam('mysupercoolgroup')[2]])"
0
ответ дан 23 November 2019 в 02:16
поделиться

Следующая команда выведет список всех пользователей, принадлежащих к , но только тех, которые управляются базой данных / etc / group , а не LDAP, NIS и т. Д. Это также ] работает только для вторичных групп , он не будет перечислять пользователей, у которых эта группа установлена ​​как первичная, поскольку основная группа хранится как GID (числовой идентификатор группы) в файле / и т. д. / passwd .

awk -F: '/^groupname/ {print $4;}' /etc/group
16
ответ дан 23 November 2019 в 02:16
поделиться

немного grep и tr:

$ grep ^$GROUP /etc/group | grep -o '[^:]*$' | tr ',' '\n'
user1
user2
user3
3
ответ дан 23 November 2019 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: