Script Python para listar usuarios y grupos

Estoy tratando de codificar un script que genere a cada usuario y su grupo en su propia línea de la siguiente manera:

user1 group1 user2 group1 user3 group2 ... user10 group6 

etc.

Estoy escribiendo un script en python para esto, pero me preguntaba cómo podría hacerlo SO.

ps. Dale un vistazo a eso en cualquier idioma, pero preferiría python.

EDIT: Estoy trabajando en Linux. Ubuntu 8.10 o CentOS =)

    Related of "Script Python para listar usuarios y grupos"

    Para * nix, tienes los módulos pwd y grp . Usted itera a través de pwd.getpwall() para obtener todos los usuarios. grp.getgrgid(gid) nombres de sus grupos con grp.getgrgid(gid) .

     import pwd, grp for p in pwd.getpwall(): print p[0], grp.getgrgid(p[3])[0] 

    el modulo de grp es tu amigo Mire grp.getgrall() para obtener una lista de todos los grupos y sus miembros.

    Ejemplo de edición :

     import grp groups = grp.getgrall() for group in groups: for user in group[3]: print user, group[0] 

    sh / bash

     getent passwd | cut -f1 -d: | while read name; do echo -n "$name " ; groups $name ; done 

    La llamada de python a grp.getgrall() solo muestra los grupos locales, a diferencia de la función de call to getgrouplist que ejecuta a todos los usuarios, por ejemplo, los usuarios en sssd que están respaldados por un ldap pero que tienen la enumeración desactivada. (como en FreeIPA). Después de buscar la forma más fácil de obtener todos los grupos a los que pertenecen los usuarios en python, la mejor forma que encontré fue llamar a la función 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 

    Obtener una lista de todos los usuarios para ejecutar esta función de manera similar requeriría averiguar qué llamada se realiza con la getent passwd de getent passwd y llamar a python.

    Creo que este código satisface sus necesidades, simplemente utilizando las funciones principales del intérprete de Python, sin la necesidad de utilizar módulos adicionales:

    una función simple que es capaz de tratar con la estructura de cualquiera de estos archivos (/ etc / passwd y / etc / group).

    Aquí está el código:

     #!/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); 

    Alimentado a os.popen o lo que sea ….

    “grupos de hombres”

    GRUPOS (1) Comandos de usuario GRUPOS (1)

    NOMBRAR grupos: imprime los grupos en los que está un usuario

    Grupos de SINOPSIS [OPCIONAL] … [NOMBRE DE USUARIO] …

    DESCRIPCIÓN Imprimir membresías de grupo para cada USERNAME o, si no se especifica USERNAME, para el proceso actual (que puede diferir si la base de datos de grupos ha cambiado).

    ….