Python script, чтобы указать пользователей и группы
Я пытаюсь закодировать script, который выводит каждого пользователя и их группу на их собственную строку следующим образом:
user1 group1
user2 group1
user3 group2
...
user10 group6
и т.д..
Я пишу script в python для этого, но задавался вопросом, как SO может это сделать.
p.s. Возьмите на себя удар на любом языке, но я бы предпочел python.
EDIT: Я работаю над Linux. Ubuntu 8.10 или CentOS =)
Ответы
Ответ 1
Для * nix у вас есть pwd и grp. Вы проследуете через pwd.getpwall()
, чтобы получить всех пользователей. Вы просматриваете имена своих групп с помощью grp.getgrgid(gid)
.
import pwd, grp
for p in pwd.getpwall():
print p[0], grp.getgrgid(p[3])[0]
Ответ 2
модуль grp
- ваш друг. Посмотрите grp.getgrall()
, чтобы получить список всех групп и их членов.
EDIT пример:
import grp
groups = grp.getgrall()
for group in groups:
for user in group[3]:
print user, group[0]
Ответ 3
ш/bash:
getent passwd | cut -f1 -d: | while read name; do echo -n "$name " ; groups $name ; done
Ответ 4
Вызов 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 enough 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.
Ответ 5
Я считаю, что этот код отвечает вашим потребностям, просто используя основные функции интерпретатора 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)
Ответ 6
ФРС для os.popen или что-то еще....
"группы людей"
ГРУППЫ (1) Команды пользователя ГРУППЫ (1)
NAME groups - печатать группы, в которых пользователь находится в
СИНТАКСИС групп [OPTION]... [USERNAME]...
ОПИСАНИЕ Выбирайте членство в группе для каждого пользователя USERNAME или, если не указано USERNAME, для текущего процесса (который может отличаться, если группа изменилась).
....