使用augtool静止

使用augtool静止

我想确保我有这些台词......

root: /dev/null
greenman: /dev/null

... 在我的/etc/aliases文件中,我一直在学习augtool。我知道我可以用 augtool 做这样的事情...

$ sudo augtool set /files/etc/aliases/15/name greenman

...但我不喜欢对 进行硬编码15。在某些系统上,它很可能greenman: /dev/null是第 10 个名称/值对。有没有办法避免在 中使用数字/files/etc/aliases/15/name

谢谢

答案1

在 Augeas 中处理seq条目(这些编号条目,例如15您的情况)可能有点棘手。

使用augtool静止

你可以自己创建一个如下所示的 augtool 脚本:

#!/usr/bin/augtool -sf

# First, match /etc/aliases, only if there's no "greenman" entry yet
# This will define a `$yellowwoman` variable which will contain `/etc/aliases`,
# but only if there is no "greenman" entry yet (i.e. the count of the
# "greenman" entries is 0)
defvar yellowwoman /files/etc/aliases[count(*[name="greenman"])=0]

# Add the greenman entry at the end
# (using `01`, which is never used automatically in `seq` entries)
set $yellowwoman/01/name greenman

# Now set the value for the "greenman" entry,
# which you can be sure exists.
# Don't reuse the `$yellowwoman` variable, otherwise you'll
# only set the value when "greeman" wasn't there yet
# By selecting the "greenman" entry, you will always set the value
# even if the entry already existed in the file
set /files/etc/aliases/*[name="greenman"]/value /dev/null

shebang ( #!/usr/bin/augtool -sf) 用于-s在进行更改后自动保存,并-f获取带有命令的文件,使其成为可自执行的脚本,因此您只需使文件可执行并运行它即可:

$ chmod +x greenman.augtool
$ sudo ./greenman.augtool
Saved 1 file(s)
$ sudo ./greenman.augtool # it should be idempotent, too

如果你不想使脚本可执行,你也可以将其传递给augtool

$ sudo augtool --autosave --file greenman.augtool
Saved 1 file(s)

如果您不想使用--autosave,您可以将其添加save为脚本的最后一行。

使用“真正的”编程语言

Bash 很不错,但克服它的局限性会导致解决方案很复杂。Augeas 在许多语言中都有很多绑定。只需选择一种,编写代码就会变得更容易,因为您将能够使用持久的 Augeas 处理程序。以下是 Ruby 的示例:

#!/usr/bin/env ruby

require 'augeas'

Augeas.open do |aug|
  if aug.match('/files/etc/aliases/*[name="greenman"]').empty?
    # Create a new "greeman" entry
    aug.set('/files/etc/aliases/01/name', 'greenman')
  end
  # Set the value
  aug.set('/files/etc/aliases/*[name="greenman"]/value', '/dev/null')
  # Commit your changes
  aug.save!
end

使用 Puppet

mailalias在 Puppet 中,最好的解决方案是依靠augeas提供者服务提供者。它使用 Augeas Ruby 库来安全地编辑/etc/aliases

mailalias { 'greenman':
  ensure    => present,
  recipient => '/dev/null',
  provider  => augeas,
}

注意:mailalias标准人偶类型,但默认提供商不使用 Augeas。

相关内容