Скрипт Python для списка пользователей и групп
Я пытаюсь закодировать скрипт, который выводит каждого пользователя и их группу в их собственной строке следующим образом:
user1 group1
user2 group1
user3 group2
...
user10 group6
etc.
Я пишу сценарий на python для этого, но мне было интересно, как это сделать.
p.s. Возьмите удар на любом языке, но я бы предпочел python.
EDIT: я работаю над Linux. Ubuntu 8.10 или CentOS =)
6 ответов
на grp
модуль-ваш друг. Посмотреть grp.getgrall()
чтобы получить список всех групп и их членов.
редактировать пример:
import grp
groups = grp.getgrall()
for group in groups:
for user in group[3]:
print user, group[0]
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 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
получение списка всех пользователей для запуска этой функции аналогично потребует выясните, что вызов c производится getent passwd
и назовите это в python.
Я считаю, что этот код отвечает вашим потребностям, просто используя основные функции интерпретатора 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);
подается в ОС.попен или как его там....
"группы человек"
группы(1) группы команд пользователя (1)
имя группы-печать групп, в которых находится пользователь
синопсис группы [вариант]... [ИМЯ ПОЛЬЗОВАТЕЛЯ.]..
описание Печать членства в группах для каждого имени пользователя или, если имя пользователя не указано, для текущего процесс (который может отличаться, если база данных групп изменилась).
....