Настройка PAM с помощью Augeas

Я пытаюсь использовать Augeas для настройки файлов в моем каталоге /etc/pam.d при установке Ubuntu 14.04 по умолчанию. Моя цель состоит в том, чтобы найти все узлы, которые имеют аргумент 'nullok' или 'nullok_secure', и удалить эти аргументы из конфигурации. В конечном итоге это будет выполняться Puppet, но в настоящее время я работаю над настройкой, используя augtool на локальной машине.

Из всего, что я прочитал, следующие выражения ДОЛЖНЫ дать мне узлы с 'nullok и'nullok_secure':

augtool print /files/etc/pam.d/*/*/argument[../argument = 'nullok']
augtool print /files/etc/pam.d/*/*/argument[../argument = 'nullok_secure']

Или поочередно:

augtool print /files/etc/pam.d/*/*/argument[. = 'nullok']
augtool print /files/etc/pam.d/*/*/argument[. = 'nullok_secure']

К сожалению, это никуда меня не приведет, и я не могу понять, почему. Это augtool print из тех файлов, которые я знаю, есть аргумент (для краткости удалены комментарии):

/files/etc/pam.d/common-auth
/files/etc/pam.d/common-auth/1
/files/etc/pam.d/common-auth/1/type = "auth"
/files/etc/pam.d/common-auth/1/control = "[success=2 default=ignore]"
/files/etc/pam.d/common-auth/1/module = "pam_unix.so"
/files/etc/pam.d/common-auth/1/argument = "nullok_secure"
/files/etc/pam.d/common-auth/2
/files/etc/pam.d/common-auth/2/type = "auth"
/files/etc/pam.d/common-auth/2/control = "[success=1 default=ignore]"
/files/etc/pam.d/common-auth/2/module = "pam_lsass.so"
/files/etc/pam.d/common-auth/2/argument = "try_first_pass"
/files/etc/pam.d/common-auth/3
/files/etc/pam.d/common-auth/3/type = "auth"
/files/etc/pam.d/common-auth/3/control = "requisite"
/files/etc/pam.d/common-auth/3/module = "pam_deny.so"
/files/etc/pam.d/common-auth/4
/files/etc/pam.d/common-auth/4/type = "auth"
/files/etc/pam.d/common-auth/4/control = "required"
/files/etc/pam.d/common-auth/4/module = "pam_permit.so"
/files/etc/pam.d/common-auth/5
/files/etc/pam.d/common-auth/5/type = "auth"
/files/etc/pam.d/common-auth/5/control = "optional"
/files/etc/pam.d/common-auth/5/module = "pam_cap.so"

Что мне здесь не хватает? Разве эти команды не должны давать мне искомые узлы?

2 ответа

Во-первых, два перечисленных вами выражения не являются строго эквивалентными.

/files/etc/pam.d/*/*/argument[../argument = 'nullok']

выбирает argument узлы 2 уровня под /files/etc/pam.d которые имеют argument родственный узел (или сами) со значением, установленным в nullok, в то время как

/files/etc/pam.d/*/*/argument[. = 'nullok']

выбирает argument узлы 2 уровня под /files/etc/pam.d со значением, установленным на nullok (но не их братья и сестры, если таковые имеются).

Теперь проблема в том, что argument узлы, которые вы пытаетесь сопоставить, на самом деле 3 уровня под /files/etc/pam.d, а не 2, так что вам нужен еще один уровень /*,

Самый простой способ избежать подсчета уровней - сопоставить на любом уровне, используя // вместо:

/files/etc/pam.d//argument[.='nullok']

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

После проработки некоторых вещей в IRC-зале Augeas, похоже, моя проблема была просто синтаксической ошибкой. При непосредственном использовании "augtool print" (без перехода в приглашение augtool>) пути должны быть заключены в кавычки. Имея в виду,

augtool print /files/etc/pam.d/*/*/argument[. = 'nullok_secure']

Не сработает, но:

augtool print '/files/etc/pam.d/*/*/argument[. = "nullok_secure"]'

Дает правильные результаты. Кроме того, если вы перейдете в приглашение augtool, команда будет работать правильно, даже без кавычек:

$ augtool
augtool> print /files/etc/pam.d/*/*/argument[. = 'nullok_secure']
Другие вопросы по тегам