Analisa o parâmetro específico do script python

0

Eu tenho uma saída de chage que eu mesmo formava como contas. Basicamente, ele tem o nome do usuário listado como uma seção e, em seguida, as informações abaixo dele (que são os parâmetros). Eu gostaria de basicamente analisar todas as contas que têm conta expires = nunca e me dar o nome da seção para um novo arquivo. Aqui está como são as contas do arquivo:

[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

Aqui está o que eu tenho até agora, mas não consigo entender exatamente como eu gostaria.

#!/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()

Eu percebo que estou apenas colocando 'ainda tem acesso' no novo arquivo chamado 'access', mas eu realmente gostaria de exibir o nome de usuário lá. Obrigado por qualquer ajuda.

    
por unixpipe 04.11.2014 / 19:47

2 respostas

0

Aqui está o que eu notei que realmente funcionou. Eu mudo len (nunca) == 1 para len (nunca) == 2. Parece funcionar e eu suponho que é porque ele está procurando por um comprimento exato de 2 combinações de nunca para essas duas opções (a conta expira e senha campos inativos). Estou certo?

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)
    
por 07.11.2014 / 19:26
0

Você tem código que copia desnecessariamente as coisas para um array diferente. Isso é reduzido a um simples loop sobre os resultados de _cfg . Eu não estou escrevendo access , mas insisto em como coletar todas as informações, depois escreva tudo finalmente no final, depois do loop principal. (Se você tiver muitos dados, escrever conforme você lê começa a fazer sentido novamente, mas para um trabalho simples e rápido, eu coleciono e escrevo.)

#!/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)

Você nunca usou re ou sys , e havia outro código morto em seu script também.

    
por 06.11.2014 / 13:19