LINUX.ORG.RU

Вывести всех пользователей конкретной группы.

 , ,


0

2

Как вывести всех пользователей определённой группы? Я делаю так:

grep $(grep group_name /etc/group | cut -f 3 -d:) /etc/passwd | cut -f 1 -d:
но мне кажется, что я делаю что-то не так, и есть куда более просто способ.

мне кажется, что я делаю что-то не так

Всё так делаешь. Штатной команды, как ни странно, нет.

ashot ★★★★
()

во-первых, ты получишь неверный ответ своим методом: допустим uid искомой группы 10, а у тебя есть пользователь с uid 100. его выведет как члена группы. выучи awk.

во-вторых, группы могут быть не только локальные: группы и пользователи могут подтягиваться например из NIS и LDAP. поэтому только getent.

(относительно) правильный ответ:

getent passwd | awk -F: -v group_name="mygroup" '
  BEGIN {
    "getent group " group_name | getline groupline;
    if (!groupline) exit 1;
    split(groupline, groupdef, ":");
    guid = groupdef[3];
    split(groupdef[4], users, ",");
    for (k in users) print users[k]
  }
  $4 == guid {print $1}'

val-amart ★★★★★
()

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

Про сетевых пользователей и getent тебе правильно сказали.

У меня такой скриптец получился:

GROUP=$(getent group "group_name")
USERS1="$(echo "$GROUP" | cut -d : -f 4 | tr , '\n')"
GID=$(echo "$GROUP" | cut -d : -f 3)
USERS2=$(getent passwd | grep -E "^([^:]+:){3}$GID:" | cut -d : -f 1)
echo -e "$USERS1\n$USERS2" | sort -u | grep -v '^$'

tiandrey ★★★★★
()
Ответ на: комментарий от val-amart

во-первых, ты получишь неверный ответ своим методом: допустим uid искомой группы 10, а у тебя есть пользователь с uid 100. его выведет как члена группы. выучи awk.

Не awk'ом единым. Во-первых, есть grep -w; во-вторых, можно ограничители поставить по краям. Но на awk'е красивее выглядит, да.

tiandrey ★★★★★
()
GRP=group_name

groups $(getent passwd | awk -F':' '$3 >= 500 {print $1}') | awk "/ $GRP/"' {print $1}'

Можно убрать $3 >= 500
anonymous
()
Ответ на: комментарий от ashot

Всем спасибо. Попробую все предложенные способы, но надеялся что есть простое и элегантное решение.

antoshka117
() автор топика
Ответ на: комментарий от anonymous
yunake@x230:~$ grep wheel /etc/group
wheel:x:10:root,kovalena,yunake
yunake@x230:~$ awk -F: '$4 == 10 {print}' /etc/passwd
yunake:x:1024:10::/home/yunake:/bin/bash
dima:x:1249:10::/home/dime:/usr/bin/nologin
yunake@x230:~$ GRP=wheel
yunake@x230:~$ groups $(getent passwd | awk -F':' '$3 >= 500 {print $1}') | awk "/ $GRP/"' {print $1}'
tty
yunake@x230:~$ grep tty /etc/group
tty:x:5:yunake
val-amart ★★★★★
()
Ответ на: комментарий от val-amart

вчитался. господи, тут столько ошибок что даже не знаю где начать.

ты получаешь список всех не-системных пользователей. ок.

затем ты его кормишь команде `groups`. но она принимает только одного пользователя как аргумент, первого, и тихо игнорирует всех остальных.

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

КААК это должно было работать? ты вообще чем думал, и на каком искусственном примере тестировал?

у тебя все наоборот. почитай мой авкашный скрипт. там все понятно тебе что происходит?

val-amart ★★★★★
()
Ответ на: комментарий от val-amart

УМВР, покажи вывод

groups kovalena yunake

Если вывод groups «нестабилен» между версиями команды, то мой вариант негоден

anonymous
()
Ответ на: комментарий от anonymous
yunake@x230:~$ groups kovalena yunake
wheel kovalena
yunake@x230:~$ groups yunake
tty lp wheel uucp games network video audio storage power vboxusers wireshark plugdev kvm
yunake@x230:~$ groups kovalena
wheel kovalena



вывод groups я только что проверил на линуксе, openbsd и соляре — у них одинаковый интерфейс и вывод.

val-amart ★★★★★
()
Ответ на: комментарий от val-amart

Ты успокойся и подумай еще, а то ты истеришь из-за своего перегруженного awk-скрипта, боишься проиграть? Разве тут соревнования?

anonymous
()
Ответ на: комментарий от anonymous

нет, а то спорил бы и с другими inferior имплементациями в этом треде %)

просто этот вариант мне показался настолько невозможным что надо было во-первых предупредить ТСа, во-вторых возможно что-то подсказать тебе. извини, если в тексте выглядит как истерика, that was not the point.

val-amart ★★★★★
()
Ответ на: комментарий от val-amart

Debian jessie

$ dpkg -S /usr/bin/groups 
coreutils: /usr/bin/groups

$ GRP=kvm
$ groups $(getent passwd | awk -F':' '$3 >= 500 {print $1}') | awk "/ $GRP/"' {print $1}'
vasea
sveta



$ groups $(getent passwd | awk -F':' '$3 >= 500 {print $1}') 
nobody : nogroup
vasea : vasea adm uucp dialout cdrom floppy audio dip video plugdev users netdev lpadmin scanner bluetooth saned colord kvm davfs2 libvirt
sveta : sveta uucp dialout cdrom floppy audio dip video plugdev users netdev lpadmin scanner bluetooth saned colord kvm davfs2
kukussh : kukussh
hitech : hitech
monea : monea
info : info
spam : spam
torrent : users
timur : users
anonymous
()
Ответ на: комментарий от anonymous

Я спросил Джима Мейеринга за завтраком чего это они так. Потому что новые фичи это кул. Ну ок, стандарта-то все-равно нет. Мой вывод прост: не использовать groups в кроссплатформенных скриптах. getent есть везде и работает одинаково, и делает все что надо.

val-amart ★★★★★
()
Ответ на: комментарий от val-amart

Я спросил Джима Мейеринга за завтраком чего это они так

А он сдулся и в окно улетел.
Меня как из ушата окатили.
Так гадко стало.
И обидно.
Пустышкa

anonymous
()
Ответ на: комментарий от anonymous

луркал под аноном задолго до регистрации. лор-фольклор в твоем исполнении мне действительно непонятен. очевидно, ты предпочитаешь спесиво важничать вместо того чтобы спуститься на землю и обьяснить что ты имел ввиду.

val-amart ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.