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

我需要从脚本中编辑 /etc/sudoers来添加/删除白名单中的内容。

假设我有一个可以在普通文件上工作的命令,那么如何将其应用到 /etc/sudoers

我可以复制和修改它,然后有 visudo代替原来的修改副本?通过在 $EDITOR中提供我自己的脚本?

或者我可以用同样的锁和 cp

这个问题更多的是关于潜在的问题,而不仅仅是找到一些有用的东西。

94808 次浏览

您应该对一个临时文件进行编辑,然后使用 visdo-c-f sudoers.temp 确认更改是有效的,然后将其复制到/etc/sudoers 的顶部

#!/bin/sh
if [ -f "/etc/sudoers.tmp" ]; then
exit 1
fi
touch /etc/sudoers.tmp
edit_sudoers /tmp/sudoers.new
visudo -c -f /tmp/sudoers.new
if [ "$?" -eq "0" ]; then
cp /tmp/sudoers.new /etc/sudoers
fi
rm /etc/sudoers.tmp

Visual do 应该是编辑 /etc/sudoers的人机界面。您可以通过直接替换文件来实现同样的目的,但是您必须注意并发编辑和语法验证。注意 r--r-----权限。

设置自定义编辑器。基本上,它将是一个接受文件名(在本例中为/etc/sudoers.tmp)并修改和保存该文件名的脚本。所以你可以写出来到那个文件。当您完成后,退出脚本,然后 vidodo 将负责为您修改实际的 sudoers 文件。

sudo EDITOR=/path/to/my_dummy_editor.sh visudo

使用一个自定义编辑器可视化这一点。这解决了所有的比赛条件和“黑客”的问题与布莱恩的解决方案。

#!/bin/sh
if [ -z "$1" ]; then
echo "Starting up visudo with this script as first parameter"
export EDITOR=$0 && sudo -E visudo
else
echo "Changing sudoers"
echo "# Dummy change to sudoers" >> $1
fi

这个脚本将在 sudoers 的末尾添加一行“ # Dumychange to sudoers”。没有黑客,也没有竞争条件。

注释版本,解释了这实际上是如何工作的:

if [ -z "$1" ]; then


# When you run the script, you will run this block since $1 is empty.


echo "Starting up visudo with this script as first parameter"


# We first set this script as the EDITOR and then starts visudo.
# Visudo will now start and use THIS SCRIPT as its editor
export EDITOR=$0 && sudo -E visudo
else


# When visudo starts this script, it will provide the name of the sudoers
# file as the first parameter and $1 will be non-empty. Because of that,
# visudo will run this block.


echo "Changing sudoers"


# We change the sudoers file and then exit
echo "# Dummy change to sudoers" >> $1
fi

根据其他人在这里发布的内容,这对我很有效。当我使用其他人的脚本,它会为我打开可视化,但不会进行编辑。这使得我需要进行编辑,以允许所有用户(包括标准用户)安装用于 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

这将% everyone 等等添加到 sudoers 文件的底部。 我不得不这样运行剧本。

sudo sh sudoersedit.sh

祝你好运 D

只是为了给上面的答案添加一个进一步的选项,如果竞争条件不是一个主要问题,那么可以使用以下命令来避免手动将修改后的文件复制到 /etc/sudoers

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

这将确保新文件通过权限更新得到验证和正确安装。

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

在大多数发行版上(至少基于 Debian、 Redhat、 openSUSE 等) ,你可以在 /etc/sudoers.d/目录中插入一个自定义脚本,具有 0440权限——更多信息请参见 man sudo(“包含来自 sudo 内部的其他文件”)或者 官方网站上的相同信息。

可能会有帮助。

我认为最直接的解决办法是:

创建一个脚本 小声点

#!/bin/sh


while [ -n "$1" ]; do
echo "$1    ALL=(ALL:ALL) ALL" >> /etc/sudoers;
shift # shift all parameters
done

并与您想要添加它的用户一起调用它:

root prompt> ./addsudoers.sh user1 user2

有关完整的解释,请参阅以下答案: 通过 shell 脚本向 sudoers 添加用户

问候!

尝试回显它。但是你必须在子 shell 中运行它。例如:

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

陈词滥调,但是:

echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo

如果您的 sudo允许在 /etc/sudoers.d中添加条目,那么您可以通过@dragon788使用这个答案:

Https://superuser.com/a/1027257/26022

基本上,在将文件复制到 /etc/sudoers.d之前,可以使用 visudo来验证该文件,因此可以确保不会对任何人破坏 sudo

visudo -c -q -f filename

这将检查它,如果它有效,则返回成功(0) ,因此您可以将它与 if&&和其他脚本布尔操作一起使用。一旦您验证,只需复制到 /etc/sudoers.d,它应该工作。确保它属于 root 用户,而不能被其他用户写入。

有很多答案,长期以来一直使用 sudo,但直到现在才需要自动化安装配置。 我混合使用了上面的一些答案,将我的配置行写到/etc/sudoers.d include 位置,这样我就不必修改主 sudoers 文件,然后检查该文件的语法,下面是一个简单的例子:

将您的行写入 sudoers include 文件:

sudo bash -c 'echo "your_user ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/99_sudo_include_file'

检查 sudoers 包含的文件是否通过了 Visual do 语法检查:

sudo visudo -cf /etc/sudoers.d/99_sudo_include_file

这是我想出来的解决方案。这是一个快速和肮脏的解决方案,但它的工作..。

echo "username ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers

它将 echo 输出通过管道传输到在 sudo 下运行的 tee 中。T 然后将输出附加到 sudoers 文件中。

因为这个问题比 这个有更多的 pv,而且 sedtee更灵活,所以我将在这里留下一个“更好的”溶剂和我的解决方案的链接。

基于 瓦列里 · 帕诺夫的回答,我写了这个

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

取消 /etc/sudoers中此行的注释

# %wheel  ALL=(ALL)       ALL