2009-07-21 21 views
8

Quiero usar Python para obtener el ID de grupo en un nombre de grupo correspondiente. La rutina debe funcionar para sistemas operativos tipo Unix (Linux y Mac OS X).obtener ID de grupo por nombre de grupo (Python, Unix)

Esto es lo que he encontrado hasta ahora

>>> import grp 
>>> for g in grp.getgrall(): 
...  if g[0] == 'wurzel': 
...   print g[2] 

Respuesta

15

Si usted lee la grp module documentation verá que grp.getgrnam (nombre de grupo) devolverá una entrada de la base de datos del grupo, que es un objeto tupla similar. Usted puede tener acceso a la información por índice o por atributos:

>>> import grp 
>>> groupinfo = grp.getgrnam('root') 
>>> print groupinfo[2] 
0 
>>> print groupinfo.gr_gid 
0 

Otras entradas son el nombre, la contraseña cifrada (generalmente vacío, si se utiliza un archivo de sombra, que va a ser un valor ficticio) y todos los miembros del grupo nombres. Esto funciona bien en cualquier sistema Unix, incluyendo mi Mac OS X portátil:

>>> import grp 
>>> admin = grp.getgrnam('admin') 
>>> admin 
('admin', '*', 80, ['root', 'admin', 'mj']) 
>>> admin.gr_name 
'admin' 
>>> admin.gr_gid 
80 
>>> admin.gr_mem 
['root', 'admin', 'mj'] 

El módulo también ofrece un método para obtener las entradas por GID, y como has descubierto, un método para recorrer todas las entradas en la base de datos:

>>> grp.getgrgid(80) 
('admin', '*', 80, ['root', 'admin', 'mj']) 
>>> len(grp.getgrall()) 
73 

por último, pero no menos importante, pitón ofrece una funcionalidad similar para obtener información sobre los archivos de contraseñas y sombras, en los módulos pwd y spwd, que tienen una API similar.

+0

Tenga en cuenta que debido a que existe un límite para la cantidad de miembros que un grupo de Unix puede tener, algunos sistemas (grandes) tienen múltiples grupos de Unix con el mismo GID pero diferentes nombres, por ejemplo: 'admin',' admin2', 'admin3', etc. Es posible que no lo sepa porque los archivos se almacenan con su UID/GID numérico, y herramientas como 'ls' buscan el GID y muestran el primer nombre encontrado, que en mi ejemplo sería' admin'. Así que es posible que se sorprenda al descubrir que una cuenta de usuario determinada no está en el grupo 'admin', sino que en realidad es' admin2' u otro alias. Debe filtrar todos los grupos por GID para encontrar los alias AFAICT. – RobM

5

Mira grp.getgrnam(name):

grp.getgrnam(name)

devolver la entrada de base de datos de grupo para el nombre del grupo dado. KeyError se genera si la entrada solicitada no se puede encontrar.

entradas de base de datos de grupo se presentan como un objeto tupla-como, cuyos atributos corresponden a los miembros de la estructura del grupo:

Index Attribute Meaning 

0 gr_name  the name of the group 
1 gr_passwd the (encrypted) group password; often empty 
2 gr_gid the numerical group ID 
3 gr_mem all the group member’s user names 

El ID de grupo numérico está en el índice 2, o segundo de la última, o el atributo gr_gid.

GID de root es 0:

>>> grp.getgrnam('root') 
('root', 'x', 0, ['root']) 
>>> grp.getgrnam('root')[-2] 
0 
>>> grp.getgrnam('root').gr_gid 
0 
>>> 
+0

Probablemente también deba enlazar a http://docs.python.org/library/grp.html – Stobor

+0

Derecha. Tal vez podrías desplazarte a la parte superior del documento en tu navegador. – gimel