Вывести пользователя, который состоит в большинстве групп Linux

Рейтинг: -1Ответов: 2Опубликовано: 02.03.2023

Нужна команда\программа для вывода пользователя состоящего в большинстве групп на Linux. Если такой команды не существует, то как сделать ее программу на C?

Все что я смог это getent group

Заранее спасибо.

Ответы

▲ 4Принят
for user in `cut /etc/passwd -d : -f 1`; 
do 
  echo -n "$user "
  groups $user | sed -e 's/.*: //' |wc -w
done \
  | sort -k 2 -n -r \
  | head -1

Извлекаете список пользователей из /etc/passwd: команда cut /etc/passwd -d : -f 1 разбивает каждую строку на колонки двоеточиями и выводит первую колонку.

Затем для каждого пользователя извлекаете список групп: groups $user Команда выводит в формате user : group1 group2 ..., поэтому сначала sed -e 's/.*: // отрезает часть user : , затем wc -w подсчитывает количество слов group1, group2 и т.д.

Благодаря echo "$user " цикл печатает список

root 1
daemon 1
bin 1
sys 1
sync 1
saned 2
...

и так далее

sort -k 2 -n -r сортирует по второму столбцу (число групп) в обратном порядке - строка с самым большим числом групп будет первой

head -1 печатает первую строку.

▲ 0

Поискав интернет нашел нужный мне ответ и написал код который выполняет эту задачу.

import os
os.system("for user in $(awk -F: '{print $1}' /etc/passwd); do groups $user; done > users.txt")
users, usersList = open("users.txt", "r"), []
for i in users:
    temp = i.split(':')
    tmp = temp[1].split(' ')
    tmp.pop(0)
    usersList.append([temp[0], tmp])
max, maxindex = 0, 0
for i in range(len(usersList)):
    if len(usersList[i][1]) > max:maxindex = i
print('Пользователь ' + usersList[maxindex][0] + 'состоит в ' + str(len(usersList[maxindex][1])) + ' группах')
print('Группы: ' + ' '.join(usersList[maxindex][1]))