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

С помощью gawk, из его man-страницы о массивах можно прочитать подробное объяснение.

В большинстве других языков массивы должны быть объявлены перед использованием, в том числе спецификация того, сколько элементов или компонентов они содержат. На сайте такие языки, декларация вызывает непрерывный блок памяти, чтобы быть выделено для такого количества элементов. Обычно индекс в массиве должно быть положительным целым числом. Например, нулевой индекс определяет первый элемент в массиве, который на самом деле хранится в начале блока памяти. В первом индексе указывается второй элемент, который хранится в памяти сразу после первого элемента, и так далее. Так и есть невозможно добавить больше элементов в массив, потому что в нем есть только место. за столько же элементов, сколько указано в декларации. (Некоторые языки допускают произвольные начальный и конечный индексы, например, '15 ... 27' - но При объявлении массива размер массива остается фиксированным)

.....

Массивы в awk различны - они ассоциативны. Это означает, что каждый массив представляет собой набор пар: индекс и соответствующее ему значение элемента массива

Таким образом, можно определить массив без указания его размера:

$ awk 'BEGIN{a[0]=1;a[10]=2;print length(a)}'
2

Это не похоже на perl, в которых для массива используется смежный блок памяти:

$ perl -le '$a[0]=1;$a[10]=1;print ~~@a'
11

А perl хэш очень похож на массив gawk:

$ perl -le '$a{0}=1;$a{10}=1;print ~~keys %a'
2

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

1
05.03.2015, 00:39
3 ответа

Если вы хотите перечислить пользователей, основной группой которых является somegroup :

gid=$(getent group somegroup | awk -F : '{print $3}')
getent passwd | awk -F : -v gid="$gid" '$4 == gid'

Этот ответ предполагает наличие не встроенного Linux, так как он полагается на утилиту Glibc getent .

Вы можете настроить нужные вам поля в выводе, настроив вторую команду awk. Например, чтобы распечатать только их настоящее имя и телефонный номер:

getent passwd | awk -F : -v gid="$gid" '$4 == gid {print $5}'

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

usernames=$(getent group somegroup | awk -F : '{print $3 "," $4}')
gid=${usernames%%,*}; usernames=${usernames#*,}
getent passwd | awk -F : -v gid="$gid" -v usernames="$usernames" '
    BEGIN {split(usernames, names, /,/); for (name in names) user[name]=1}
    name[$1] || $4==gid
'

Вы не можете распечатать пароли пользователей, так как они не хранятся. Вы можете распечатать хэш их паролей, если у вас есть разрешение на доступ к ним. Если ваша база паролей локальная, то хэши паролей находятся в файле /etc/shadow . Если вы получите список имен пользователей и других полей, вы можете присоединить его к теневому файлу:

… | awk … | join -t : -j 1 - /etc/shadow
1
27.01.2020, 23:51
#!/bin/bash

cut -d : -f 1 /etc/passwd | while read user
do
    # check if user is in specific group
    `groups $user` | grep -q <SPECIFICGROUP>
    if [ $? -ne 0 ] ; then
        continue;
    fi

    printf "User=${user},password=`awk -F: -v user=$user '$1 == user { print $2 ;} '`"
done

edit: не обрабатывает случай, если имя пользователя является префиксом другого имени пользователя

.
0
27.01.2020, 23:51

Ниже приведена команда, с помощью которой мы можем получить информацию о пользователях в группе и пароль пользователя

#!/bin/bash
echo "enter the groupname"
read g
for user in `getent group $g| awk -F ":" '{print $NF}'| sed "s/,/ /g"`
do
echo $user
sed -n '/'$user'/p' /etc/passwd
done| sed '1i below are list of users in group and users password'
0
27.01.2020, 23:51

Теги

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