Я пытаюсь использовать 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"
Что мне здесь не хватает? Разве эти команды не должны давать мне узлы, которые я ищу?
Во-первых, два перечисленных вами выражения не являются строго эквивалентными.
/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']