Script Python pour lister les utilisateurs et les groupes

j'essaie de coder un script qui sort chaque utilisateur et leur groupe sur leur propre ligne comme ceci:

user1 group1  
user2 group1  
user3 group2  
...  
user10 group6

etc.

j'écris un script en python pour ça mais je me demandais comment faire.

p. S. Frappez-le dans n'importe quelle langue, mais je préfère python.

EDIT: je travaille sur Linux. Ubuntu 8.10 ou CentOS =)

17
demandé sur ekad 2009-01-07 22:05:11

6 réponses

Pour *nix, vous avez l' pwd et grp modules. Vous itérer pwd.getpwall() pour obtenir tous les utilisateurs. Vous regardez leurs noms de groupe avec grp.getgrgid(gid).

import pwd, grp
for p in pwd.getpwall():
    print p[0], grp.getgrgid(p[3])[0]
18
répondu S.Lott 2014-03-12 11:08:06

grp module est votre ami. Regardez grp.getgrall() pour obtenir une liste de tous les groupes et de leurs membres.

EDIT exemple:

import grp
groups = grp.getgrall()
for group in groups:
    for user in group[3]:
        print user, group[0]
14
répondu d0k 2009-01-07 19:12:27

sh / bash:

getent passwd | cut -f1 -d: | while read name; do echo -n "$name " ; groups $name ; done
5
répondu Joachim Sauer 2009-01-07 19:19:11

l'appel de python à grp.getgrall() ne montre que les groupes locaux, contrairement à la fonction call to getgrouplist C qui renvoie tous les utilisateurs, par exemple aussi les utilisateurs dans sssd qui est soutenue par un ldap mais dont l'énumération est désactivée. (comme dans FreeIPA). Après avoir cherché le moyen le plus simple d'obtenir tous les groupes auxquels un utilisateur appartient en python, le meilleur moyen que j'ai trouvé était d'appeler la fonction 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 enought 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

obtenir une liste de tous les utilisateurs pour exécuter cette fonction de façon similaire nécessiterait comprendre ce que c appel est fait par

1
répondu Jens Timmerman 2018-04-23 10:39:46

je crois que ce code répond à votre besoin, tout en utilisant les fonctions de base de l'interpréteur Python, sans la nécessité d'utiliser des modules supplémentaires:

une fonction simple qui est capable de traiter la structure de n'importe lequel de ces fichiers (/etc/passwd et /etc/group).

Voici le code:

#!/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
répondu ivanleoncz 2017-06-29 16:14:39

de la Fed à l'os.popen ou quoi que ce soit....

"homme" groupes d'

GROUPES(1) Commandes Utilisateur à des GROUPES(1)

NOM de les groupes d'imprimer les groupes d'un utilisateur

SYNOPSIS les groupes [OPTION]... [UTILISATEUR.]..

DESCRIPTION Imprimez des adhésions de groupe pour chaque nom D'utilisateur ou, si aucun nom D'utilisateur n'est spécifié, pour les processus (qui peut différer si le la base de données des groupes a changé).

....

-2
répondu tweedleDum 2015-11-02 22:43:36