Настройка 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']