我需要从一个脚本中编辑/etc/sudoers
文件,以添加/删除白名单。
假设我有一个在普通文件上有效的命令,我如何将其应用到/etc/sudoers
文件上?
我是否可以复制并修改它,然后使用visudo
将原始文件替换为修改后的副本?或者在$EDITOR
中提供自己的脚本?
还是只需使用相同的锁和cp
命令?
这个问题更多地关注潜在的问题而不是只找出可行的方法。
除了以上答案中提到的选项外,如果竞态条件不是主要问题,那么可以使用以下命令来避免手动复制修改后的文件到/etc/sudoers
sudo EDITOR="cp /tmp/sudoers.new" visudo
这将确保新文件被正确验证并安装,并更新权限。
请注意,如果/tmp/sudoers.new
文件中有错误,则visudo
将提示用户输入,因此建议首先使用visudo -c -f /tmp/sudoers.new
检查它。
尝试使用echo命令。不过你需要在子shell中运行它。例如:
sudo sh -c "echo \"group ALL=(user) NOPASSWD: ALL\" >> /etc/sudoers"
由于这个问题的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
根据其他人在这里发布的内容,这对我很有用。当我使用其他人的脚本时,它会为我打开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
sudo sh sudoersedit.sh
祝你好运 :D