Python скрипт для вывода списка пользователей и групп - PullRequest
21 голосов
/ 07 января 2009

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

user1 group1  
user2 group1  
user3 group2  
...  
user10 group6

и т.д..

Я пишу скрипт на python для этого, но мне было интересно, как SO может это сделать.

p.s. Попробуйте его на любом языке, но я бы предпочел python.

РЕДАКТИРОВАТЬ: я работаю на Linux. Ubuntu 8.10 или CentOS =)

Ответы [ 6 ]

23 голосов
/ 07 января 2009

Для * nix у вас есть модули pwd и grp . Вы перебираете pwd.getpwall(), чтобы получить всех пользователей. Вы ищите названия их групп с grp.getgrgid(gid).

import pwd, grp
for p in pwd.getpwall():
    print p[0], grp.getgrgid(p[3])[0]
14 голосов
/ 07 января 2009

модуль grp - ваш друг. Посмотрите на grp.getgrall(), чтобы получить список всех групп и их членов.

РЕДАКТИРОВАТЬ пример:

import grp
groups = grp.getgrall()
for group in groups:
    for user in group[3]:
        print user, group[0]
5 голосов
/ 07 января 2009

ш / Баш:

getent passwd | cut -f1 -d: | while read name; do echo -n "$name " ; groups $name ; done
2 голосов
/ 23 апреля 2018

При вызове Python к grp.getgrall() отображаются только локальные группы, в отличие от вызова функции getgrouplist c, которая перезапускает всех пользователей, например, также пользователи в sssd, которые поддерживаются ldap, но у которых отключено перечисление. (как во FreeIPA). После поиска самого простого способа получить все группы, к которым принадлежат пользователи в python, я нашел лучший способ - вызвать функцию getgrouplist c:

#!/usr/bin/python

import grp, pwd, os
from ctypes import *
from ctypes.util import find_library

libc = cdll.LoadLibrary(find_library('libc'))

getgrouplist = libc.getgrouplist
# 50 groups should be enought?
ngroups = 50
getgrouplist.argtypes = [c_char_p, c_uint, POINTER(c_uint * ngroups), POINTER(c_int)]
getgrouplist.restype = c_int32

grouplist = (c_uint * ngroups)()
ngrouplist = c_int(ngroups)

user = pwd.getpwuid(2540485)

ct = getgrouplist(user.pw_name, user.pw_gid, byref(grouplist), byref(ngrouplist))

# if 50 groups was not enough this will be -1, try again
# luckily the last call put the correct number of groups in ngrouplist
if ct < 0:
    getgrouplist.argtypes = [c_char_p, c_uint, POINTER(c_uint *int(ngrouplist.value)), POINTER(c_int)]
    grouplist = (c_uint * int(ngrouplist.value))()
    ct = getgrouplist(user.pw_name, user.pw_gid, byref(grouplist), byref(ngrouplist))

for i in xrange(0, ct):
    gid = grouplist[i]
    print grp.getgrgid(gid).gr_name

Чтобы получить список всех пользователей, для которых эта функция должна выполняться аналогичным образом, потребовалось бы выяснить, какой вызов c выполняется с помощью getent passwd и вызывать его в python.

0 голосов
/ 08 апреля 2016

Я считаю, что этот код отвечает вашим потребностям, просто используя основные функции интерпретатора Python, без необходимости использования дополнительных модулей:

простая функция, которая может работать со структурой любого из этих файлов (/ etc / passwd и /etc/group).

Вот код:

#!/usr/bin/python

data = []

def iterator(f):
    for line in f.readlines():
        data.append(line.split(":")[0])
    data.sort()
    for item in data:
        print("- " + item)


with open("/etc/group","r") as f:
    print("\n* GROUPS *")
    iterator(f)
    print()

with open("/etc/passwd","r") as f:
    print("\n* USERS *")
    iterator(f)    
0 голосов
/ 03 ноября 2015

ФРС до os.popen или что-то еще ....

"мужские группы"

ГРУППЫ (1) Команды пользователя ГРУППЫ (1)

NAME groups - вывести группы, в которые входит пользователь

СИНТАКСИС группы [ОПЦИЯ] ... [ИМЯ ПОЛЬЗОВАТЕЛЯ] ...

ОПИСАНИЕ Распечатайте членство в группах для каждого ИМЯ ПОЛЬЗОВАТЕЛЯ или, если имя пользователя не указано, для текущего процесса (который может отличаться, если база данных групп изменилась).

....

...