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 =)
6 réponses
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]
sh / bash:
getent passwd | cut -f1 -d: | while read name; do echo -n "$name " ; groups $name ; done
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
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);
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é).
....