У меня есть вывод chage, который я сам отформатировал под названием аккаунты. В основном это имя пользователя, указанного в разделе, а затем информация под ним (которые являются параметрами). Я хотел бы в основном разобрать все учетные записи, которые имеют срок действия учетной записи истекает = никогда, и дать мне имя раздела для нового файла. Вот как выглядят учетные записи файла:

[user1]
Last_password_change = password_must_be_changed
Password_expires = never
Password_inactive = never
Account_expires = never
Minimum_number_of_days_between_password_change = 7
Maximum_number_of_days_between_password_change = 90
Number_of_days_of_warning_before_password_expires = 14

[user2]
Last_password_change = password_must_be_changed
Password_expires = never
Password_inactive = never
Account_expires = never
Minimum_number_of_days_between_password_change = 7
Maximum_number_of_days_between_password_change = 90
Number_of_days_of_warning_before_password_expires = 14

Вот то, что у меня есть, но я не могу понять, что именно так, как мне бы хотелось.

#!/usr/bin/python

from ConfigParser import RawConfigParser
import re
import sys

# Read configuration from ~/accounts
_cfg = RawConfigParser()
_cfg.read('accounts')
cfg = dict()
for sect in _cfg.sections():
        cfg[sect] = dict()
        for (name, value) in _cfg.items(sect):
                cfg[sect][name] = value

                if cfg[sect]['Account_expires'] == "never":

                        f = open('access','w')
                        f.write('still has access')
                        f.close()

Я понимаю, что только добавляю «все еще имеет доступ» в новый файл, называемый «доступ», но я действительно хотел бы вывести имя пользователя там. Спасибо за любую помощь.

2 ответа2

0

У вас есть код, который без необходимости копирует вещи в другой массив. Это обрезается до простого цикла по результатам _cfg . Я не пишу access но намекаю на то, как собрать всю информацию, а затем выписать все это в конце, после основного цикла. (Если у вас много данных, запись по мере того, как вы читаете, снова обретает смысл, но для простой и быстрой работы я собираю, а затем пишу.)

#!/usr/bin/env python

from ConfigParser import RawConfigParser


# Read configuration from ~/accounts
_cfg = RawConfigParser()
_cfg.read('accounts')

users = []
for sect in _cfg.sections():
    for (name, value) in _cfg.items(sect):
        # Notice that the names are normalized to all lowercase
        if name in ['account_expires', 'password_inactive'] and value=="never":
            users.append(sect)
            break  # done with this user, break out of inner loop
for user in users:
    print("User %s still has access" % user)

Во -первых, вы никогда не использовали re или sys , и в вашем скрипте также был какой-то другой мертвый код.

0

Вот что я заметил на самом деле работал. Я изменяю len(никогда) == 1 на len(никогда) == 2. Кажется, это работает, и я предполагаю, что это потому, что он ищет точную длину 2 совпадений никогда для этих двух вариантов (срок действия учетной записи и поля пароля неактивны). Я прав?

users = []
for sect in _cfg.sections():
    never = []
    for (name, value) in _cfg.items(sect):
        print("# %s: %s = %s" % (sect, name, value))
        # Notice that the names are normalized to all lowercase
        if name in ['account_expires', 'password_inactive'] and value=="never":
            never.append(name)
    # Slightly ugly, check for exactly one value in "never"
    if len(never) == 2:
        users.append(sect)
for user in users:
    print("User %s still has access" % user)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .