以编程方式更新文件的正确方法是什么sudoers
?具体来说:
- 我怎样才能添加到我的文件中的行
,timestamp_timeout=600
尾(将nag 时间增加到 10 小时),并以编程方式执行此操作而不破坏系统(我尝试过一次,导致我的 Linux 系统无法启动,不得不重新安装)。我读过这可能对此很重要。Defaults env_reset
sudoers
sudo
chmod 440
- 我知道这很危险,我明白为什么它受到保护,但这些是我的家庭系统,其中我有一个脚本可以运行数十个简单的配置更改(而且我也相当定期地重建这些系统,所以这对我很有用)以便能够自动执行此操作)。
- 我最感兴趣的是如何使用可以放入
bash
脚本中的标准 Linux 工具来完成此操作,但我也非常有兴趣了解如何在 Ansible 中完成这个确切的操作,以便我可以推出这样的简单更改sudoers
我的家庭网络上的所有文件。 - 在这一页该文件有一个讨论
sudoers
,但我不太明白其中的引用visudo -c -f
;的引用我思考建议的是:复制文件sudoers
,然后对该副本进行更改,然后visudo -c -f
检查新文件是否有效,然后覆盖sudoers
,然后chmod 440
在该新文件上,是这样吗?我不确定实施此操作的步骤。
答案1
警告: 以下作品。这样做是否是个好主意还有待商榷。但如果您要这样做,这是不太安全的方法之一。
您可以通过设置和导出变量以使用更改文件的脚本SUDO_EDITOR
来调用来完成此操作。sed
例如
export SUDO_EDITOR='sed -i -e "s/^Defaults.*env_reset$/&,timestamp_timeout=600/"'
visudo
unset SUDO_EDITOR
当然,这需要以 root 身份运行。通常SUDO_EDITOR
是未定义的......但它可以用来告诉visudo
使用vi
ornano
或joe
或任何你喜欢的东西(它比 visudo 优先于许多程序使用的更通用的 EDITOR 和 VISUAL 环境变量。visudo 将使用它们,如果它们已定义,但 SUDO_EDITOR 未定义)。在本例中,我们使用流编辑器 ( sed
) 而不是交互式编辑器。
如果您所做的任何更改无效,visudo
我们会注意到并询问您该怎么做。您的选择是:
What now?
Options are:
(e)dit sudoers file again
e(x)it without saving changes to sudoers file
(Q)uit and save changes to sudoers file (DANGER!)
您将需要使用选项x
。 e
将sed
再次运行,并将Q
保存损坏的更改。
顺便说一句,如果您需要进行其他更改,/etc/sudoers
并且出于某种原因不能直接将文件放入,/etc/sudoers.d/
那么我强烈建议您在 /etc/sudoers 的副本(例如 /tmp/sudoers)上测试您的更改并使用选项-f
与visudo
.
您可以验证是否进行了正确的更改diff
。如果它有效,那就太好了,您可以在没有-f /tmp/sudoers
.如果失败,请cp
再次运行该命令以再次复制原始文件(即恢复 SUDO_EDITOR 命令所做的任何操作),更改 SUDO_EDITOR 并visudo
再次运行。重复直到它达到你想要的效果。
# cp -af /etc/sudoers /tmp/
# export SUDO_EDITOR='sed -i -e "s/^Defaults.*env_reset$/&,timestamp_timeout=600/"'
# visudo -f /tmp/sudoers
# unset SUDO_EDITOR
# diff -u /etc/sudoers /tmp/sudoers
--- /etc/sudoers 2020-07-18 02:57:35.220317224 +1000
+++ /tmp/sudoers 2021-10-15 03:26:13.048804192 +1100
@@ -9,7 +9,7 @@
Defaults exempt_group=sudo
-Defaults env_reset
+Defaults env_reset,timestamp_timeout=600
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
顺便说一句,您可以在此处使用任何修改文件的内容 - 如果您更喜欢 perl 或 python 甚至 shell 脚本(例如周围的包装脚本ed
或ex
其他可编写脚本的编辑器),那么您没有理由不能设置SUDO_EDITOR
运行它的sed
。只要它改变了给定的文件visudo
,它就会起作用。请注意空格和嵌套引用。
答案2
以编程方式,最好的方法是将文件添加到/etc/sudoers.d
您需要的所有指令中。这些文件需要由 0440 拥有root
并具有模式 0440。将文件添加到/etc/sudoers.d
可以带来三个好处:降低/etc/sudoers
与任意更改相关的风险;在大多数情况下,这意味着/etc/sudoers
可以保留系统的默认设置,这简化了涉及修改的未来升级/etc/sudoers
;并且可以轻松查看对默认配置所做的更改。
即使对于您的超时设置,添加文件也将起作用:Defaults
行可以重复,因此添加
Defaults timestamp_timeout=600
与将其附加到现有行具有相同的效果Defaults env_reset
。
为此,您需要确保/etc/sudoers
包含
@includedir /etc/sudoers.d
这是最近安装的默认设置sudo
,但您可以通过编程方式确保这一点,如下所示:
if ! sudo grep -q '^[@#]includedir /etc/sudoers.d$' /etc/sudoers; then
sudo sed '$a\\n@includedir /etc/sudoers.d' /etc/sudoers > /etc/sudoers.new
sudo visudo -c -f /etc/sudoers.new && sudo mv /etc/sudoers{.new,}
fi
(不要尝试SUDO_EDITOR
在这里使用这个技巧,因为visudo
will 也会处理/etc/sudoers.d/README
,从而导致@include
循环。)