我需要编辑 /etc/fstab 中的行并将 fsoptions 添加/更改到找到匹配卷的行。我曾尝试使用 sed 并将找到的块放入寄存器中以将它们放回原处,但我发现这是一个挑战。也许 sed 不是最好的工具 - 我尝试了 augeas,虽然它附加了它并没有替换,并且如果找不到匹配的行但需要添加它也会失败(例如,只能使用“mount”命令,如 /dev /shm)。
例如,如果 /etc/fstab 有一行:
/dev/mapper/VolGroup1-tmp /tmp xfs dev,nosuid 0 0
我想成功
/dev/mapper/VolGroup1-tmp /tmp xfs nodev,nosuid,noexec 0 0
- 请注意,第一个块中的卷组可以是任何名称
- 字符串中的 KEYWORD 将(在此示例中)为 /tmp(但注意不要匹配 /var/tmp,除非指定)
- 文件系统可以是任何东西(不一定是 xfs)
- 任何存在的 'exec' 或 'suid' (例如)都需要被替换(如果存在),即使不存在,也需要插入 'noexec' 或 'nosuid'。
- 需要保留尾随的“0 0”。
我确定我错过了一种简单的方法来做到这一点。使用 'mount -o remount,noexec /tmp' 不会写入 /etc/fstab 所以我想使更改持久化的唯一方法是直接编辑 /etc/fstab?
我实际上打算将解决方案包装在 Puppet 中。下面的 augeas 示例在 2 个方面失败:
如果 /etc/fstab 中不存在一行(例如 /dev/shm),则会失败
如果一行存在并且有'exec',它会附加'noexec'但也离开exec
augeas{ "/etc/fstab - ${opt} on ${mount}": context => '/files/etc/fstab', changes => [ "ins opt after /files/etc/fstab/*[file = '${mount}']/opt[last()]", "set *[file = '${mount}']/opt[last()] ${opt}", ], onlyif => "match *[file = '${mount}']/opt[. = '${opt}'] size == 0", notify => Exec["remount_${mount}_${opt}"],
}