如何从脚本中编辑/etc/sudoers?

147

我需要从一个脚本中编辑/etc/sudoers文件,以添加/删除白名单。

假设我有一个在普通文件上有效的命令,我如何将其应用到/etc/sudoers文件上?

我是否可以复制并修改它,然后使用visudo将原始文件替换为修改后的副本?或者在$EDITOR中提供自己的脚本?

还是只需使用相同的锁和cp命令?

这个问题更多地关注潜在的问题而不是只找出可行的方法。

14个回答

2

除了以上答案中提到的选项外,如果竞态条件不是主要问题,那么可以使用以下命令来避免手动复制修改后的文件到/etc/sudoers

sudo EDITOR="cp /tmp/sudoers.new" visudo

这将确保新文件被正确验证并安装,并更新权限。

请注意,如果/tmp/sudoers.new文件中有错误,则visudo将提示用户输入,因此建议首先使用visudo -c -f /tmp/sudoers.new检查它。


0

尝试使用echo命令。不过你需要在子shell中运行它。例如:

sudo sh -c "echo \"group ALL=(user) NOPASSWD: ALL\" >> /etc/sudoers"


0

由于这个问题的pv比这个多得多,而且与tee相比,sed更加灵活,所以我将在此处留下一个指向“更好”的解决方案和我的解决方案的链接。

基于Valery Panov的答案,我写了这个。

echo 's/^#\s*\(%wheel\s*ALL=(ALL)\s*ALL\)/\1/g' | EDITOR='sed -f- -i' visudo

要取消在/etc/sudoers中的这一行注释

# %wheel  ALL=(ALL)       ALL

-2

根据其他人在这里发布的内容,这对我很有用。当我使用其他人的脚本时,它会为我打开visudo,但不会进行编辑。这使我能够进行所需的编辑,以允许所有用户(包括标准用户)安装适用于Safari / Firefox的Java 7u17。

#!/usr/bin/env bash
rm /etc/sudoers.new
cp /etc/sudoers /etc/sudoers.new
echo "%everyone   ALL = NOPASSWD: /usr/sbin/installer -pkg /Volumes/Java 7 Update 17/Java 7 Update 17.pkg -target /" >> /etc/sudoers.new
cp /etc/sudoers.new /etc/sudoers

这将在sudoers文件的底部添加了%everyone blah blah blah。 我必须像这样运行脚本。
sudo sh sudoersedit.sh

祝你好运 :D


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接