Вывести пользователя, который состоит в большинстве групп Linux
Нужна команда\программа для вывода пользователя состоящего в большинстве групп на Linux. Если такой команды не существует, то как сделать ее программу на C?
Все что я смог это getent group
Заранее спасибо.
Ответы (2 шт):
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 печатает первую строку.
Поискав интернет нашел нужный мне ответ и написал код который выполняет эту задачу.
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]))