使用 bash 确保 /etc/export 包含规则

使用 bash 确保 /etc/export 包含规则

使用 bash 修改 /etc/export 的工作示例是什么?

例子:

我想确保以下规则存在且有效:

/export/home 2400:123::/32(rw,no_root_squash)

它应该:

  1. 仅在尚不存在时添加(以任何形式)
  2. 如果部分存在,则应更新现有条目(例如选项更新)

现有文件中可能的语法:

  • 多个空格和不同的选项

    /export/home 2400:123::/32(rw,no_root_squash,no_subtree_check)

  • 同一行上有多个允许

    /export/home 2400:123::/32(rw,no_root_squash,no_subtree_check) 2400:321::/32(rw,no_root_squash,no_subtree_check)

除了以上的组合之外。

最初我想使用 augeas 来实现此目的,但 /etc/exports 文件中的 IPv6 地址存在错误。

/etc/exports 文件应该允许独立修改而不破坏脚本(这应该确保只有有问题的规则是正确和有效的,而保留其余规则)

答案1

如果你不能使用 Augeas 和 Puppet,我会这样做:

if grep -qF '^/export/home' /etc/exports;then
    sed -i \
    's@^/export/home.*$@/export/home 2400:123::/32(rw,no_root_squash)@'\
    /etc/exports
else
    echo '/export/home 2400:123::/32(rw,no_root_squash)' >> /etc/exports
fi

但要小心:这假设任何导出规则都/export/home可以被您给定的定义替换。

答案2

我发现 Augeas 的 /etc/exports 镜头已针对主干中的 IPv6 进行了修复,并且可以手动导入:

https://github.com/hercules-team/augeas/blob/master/lenses/exports.aug

将此文件放入,/usr/share/augeas/lenses/使其出现在默认镜头上。

相关内容