用AugeasconfigurationPAM

我正在尝试使用Augeas在默认的Ubuntu 14.04安装中configuration/etc/pam.d目录下的文件。 我的目标是find所有具有“nullok”或“nullok_secure”参数的节点,并从configuration中删除这些参数。 这将最终由Puppet强制执行,但我目前正在使用本地机器上的augtool进行configuration。

从我读过的所有东西,下面的expression式应该让我用'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 (为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" 

我在这里错过了什么? 这些命令不应该给我我正在寻找的节点?

首先,你列出的两个expression式并不完全相同。

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

select/files/etc/pam.d下的argument节点2个级别,其具有argument兄弟节点(或它们自己),其值设置为nullok ,而

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

select/files/etc/pam.d下的argument节点2个级别,其值设置为/files/etc/pam.d (但不包括它们的兄弟,如果有的话)。

现在你遇到的问题是你试图匹配的argument节点实际上是在/files/etc/pam.d下的3个级别,而不是2,所以你需要另一个级别的/*

避免计数级别的最简单的方法是在任何级别匹配,使用//代替:

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

也就是说,我不知道你打算怎么做,但是你可能想知道有一个基于Augeas的Puppet提供者来pipe理PAM条目 ,这可能比重新实现你自己的解决scheme容易得多。

在Augeas IRC房间里做了一些事情之后,似乎我的问题只是一个语法错误。 直接使用“augtool打印”(不要放入augtool>提示符)时,必须引用path。 含义,

 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']