我想从 sudoers 中删除一行。只要我给出确切的行,一切都会顺利进行。但在某些机器上,空白处可能会有所不同。即使使用“匹配”,也找不到解决方法。
file_line { '/etc/sudoers':
ensure => absent,
path => '/etc/sudoers',
line => 'myuser ALL=NOPASSWD:/bin/su -', }
有什么想法吗?谢谢 Acki
答案1
我不会ensure => absent
在这里使用它,因为它只允许精确匹配。一个简单但有效的解决方法是使用注释(或空)line
以及match
正则表达式来查找要替换的内容:
file_line { 'sudoers-myuser':
path => '/etc/sudoers',
line => '# myuser ALL=NOPASSWD:/bin/su -',
match => 'myuser.*ALL=NOPASSWD:/bin/su.*-',
}
line
即使文件中不存在,这也会导致出现问题match
,但由于内容是无操作,因此不会出现任何严重问题。小心避开正则表达式特殊字符在线上match
。
答案2
这是一个有趣的解决方案。
file_line { 'sudoers-myuser':
ensure => 'absent',
path => '/etc/sudoers',
match => 'myuser.*ALL=NOPASSWD:/bin/su.*-',
match_for_absence => true,
}
注意:出于某种原因,如果我们想根据“匹配”删除条目,“replace”必须为假。
解释(我所能提供的最好的解释):
- file_line 不允许在 line 参数中使用 RegEx,仅允许在 match 参数中使用。
- 通常情况下,“line”是需要的,但是 match_for_absence 消除了对“line”的需要。
- 这文档状态:
match_for_absence
(默认为:错误的)可选值,用于确定当ensure => missing时是否应用match。如果设置为true并且设置了match,则将删除与match匹配的行。
- 如果需要删除同一 RegEx 的多个匹配项,请添加此参数:
multiple => true,
更多详情请点击这里:file_line 无法通过正则表达式删除行?
答案3
file_line 是一种“可以”的资源,可以确保文件中出现行,但不能确保文件中不存在行,这就是我完全停止使用它的原因。
如果你确实需要逐个管理这个文件,并且需要确保该行完全消失,那么奥杰阿斯资源将更好地完成它。它相当复杂,但工作确实做得很好。并且应该已经有一个 sudoers 文件的镜头。
但洛尼克斯是正确的。你不应该以这种方式管理此文件。它充满危险,这里有怪物。
更喜欢模板和包含文件。
明确地回答你的问题:你不能。file_line 的源代码表明它仅寻找完全匹配——空格和所有内容。
def destroy
local_lines = lines
File.open(resource[:path],'w') do |fh|
fh.write(local_lines.reject{|l| l.chomp == resource[:line] }.join(''))
end
end
答案4
将您的用户信息放入一个新文件中,并将此新文件放在 /etc/sudoers.d 中
请参阅 sudoers 手册页以了解更多详细信息。(主要只是观察 /etc/sudoers.d 中的文件名不能包含“~”或“。”。因此 john_doe 是好的,而 john.doe 是不好的)
这将完全消除您遇到的困难,尝试精确匹配文件中的条目。许多服务都有 ?.d 子目录来简化此操作。(cron.d、sysctl.d、/etc/modprobe.d 等)