Модуль Python "fileinput" создает повторяющиеся записи в файлах PAM - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть четыре правила PAM

auth required pam_faillock.so preauth audit silent deny=5 unlock_time=0
auth [success=1 default=bad] pam_unix.so
auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=0
auth sufficient pam_faillock.so authsucc audit deny=5 unlock_time=0`

, которые необходимо добавить в файлы PAM /etc/pam.d/system-auth-ac и /etc/pam.d/password-auth-ac, но с соблюдением следующих условий:

1), если запись PAM ужедоступно, но с другим значением deny или unlock_time, его необходимо сбросить на значения deny=5 и unlock_time=0 соответственно;

2), если правило PAM вообще не доступно во всем файлезатем эта запись должна быть вставлена ​​над первой / начальной auth записью правила в файле.

Я пробовал использовать следующий код:

files = [
    "/etc/pam.d/system-auth-ac",
    "/etc/pam.d/password-auth-ac"
]
rules = [
    "auth sufficient pam_faillock.so authsucc audit deny=5 unlock_time=0",
    "auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=0",
    "auth [success=1 default=bad] pam_unix.so",
    "auth required pam_faillock.so preauth audit silent deny=5 unlock_time=0"
]
for file in files:
  for rule in rules:
     flag = 0
     regexrule = re.sub(r'([\[\]])', r'\\\1', rule)
     grepRule = re.sub(r'deny=5', 'deny=.*', regexrule)
     params = subprocess.Popen("egrep \'%s\' %s"%(regexrule, file), stdout=subprocess.PIPE, shell=True).communicate()[0].split("\n")
     if len(params) == 1:
        for pamd in fileinput.FileInput(file, 'inplace=1'):
            if re.match(r'auth\s+required\s+pam_tally2.so', pamd):
               continue
            if re.match(grepRule, pamd) and not flag:
               pamd = rule
               flag = 1
            elif pamd.startswith("auth") and not flag:
               pamd = rule + "\n" + pamd
               flag = 1
            print pamd.strip()

Он вставляет повторяющиеся записи PAM, когда любойзначения параметра отличается от указанного мной (вместо замены значений).

Также приведенный выше код является беспорядком, и я хочу получить элегантное решение проблемы.

1 Ответ

0 голосов
/ 11 ноября 2019

Решено с помощью следующих способов:

Метод-1:

  for file in files:
      for rule in rules:
         flag = 0
         regexrule= re.sub(r'([\[\]])',r'\\\1',rule)
         grepRule = re.sub(r'unlock_time=[0-9]*', 'unlock_time=.*',regexrule)
         grepRule = re.sub(r'deny=[0-9]*', 'deny=.*', grepRule)
         params = subprocess.Popen("egrep \'%s\' %s"%(grepRule,file),stdout=subprocess.PIPE,shell=True).communicate()[0].split("\n")
         if len(params) == 1:
            for pamd in fileinput.FileInput(file,'inplace=1'):
                if re.match(r'auth\s+required\s+pam_tally2.so',pamd):
                   continue
                if re.match(grepRule,pamd) and not flag:
                   pamd = rule
                   flag = 1
                elif pamd.startswith("auth") and not flag:
                   pamd = rule + "\n" + pamd
                   flag = 1
                print pamd.strip()
         elif len(params) == 2:
             for pamd in fileinput.FileInput(file,'inplace=1'):
                 if re.match(grepRule,pamd) and not flag:
                     pamd =  rule
                 print pamd.strip()

Метод-2:

for rule in rules:
    flag = 0
    grepRule = re.sub(r'([\[\]])',r'\\\1', rule)
    grepRule = re.sub(r'deny=\d+', 'deny=.*', grepRule)
    grepRule = re.sub(r'unlock_time=\d+', 'unlock_time=.*', grepRule)
    for pamd in fileinput.FileInput(files=("/etc/pam.d/system-auth-ac"), inplace=1):
        if re.match(grepRule, pamd.strip()):
            flag = 1
        sys.stdout.write(re.sub(grepRule, rule, pamd))
    else:
        if not flag:
            for pamd in fileinput.FileInput(files=("/etc/pam.d/system-auth-ac"), inplace=1):
                if pamd.startswith("auth") and not flag:
                    pamd = rule + "\n" + pamd
                    flag = 1
                print pamd.strip()

Однако второй метод работает только дляодин файл на тот случай, если указанные правила не найдены в файле. Для любых улучшений пунктов вышеупомянутый код приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...