136

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

假设我有一个可以处理普通文件的命令,我怎么能将它应用到/etc/sudoers

我可以复制和修改它,然后visudo用修改后的副本替换原件吗?通过提供我自己的脚本$EDITOR

或者我可以只使用相同的锁cp吗?

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

4

13 回答 13

176

旧线程,但是呢:

echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo
于 2015-02-07T13:43:31.260 回答
44

使用 visudo 和自定义编辑器。这解决了 Brian 解决方案的所有竞争条件和“黑客”问题。

#!/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

该脚本会将“# Dummy change to sudoers”这一行添加到 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
于 2010-09-14T07:13:07.873 回答
31

您应该对临时文件进行编辑,然后使用 visudo -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
于 2008-11-27T15:15:31.343 回答
22

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

它可能会有所帮助。

于 2013-07-31T08:54:33.513 回答
11

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

于 2008-11-27T15:17:48.093 回答
10

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

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

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

visudo -c -q -f filename

这会检查它并在有效时返回成功 (0),因此您可以将它与if,&&和其他脚本布尔操作一起使用。验证后,只需将其复制到/etc/sudoers.d其中即可。确保它由 root 拥有并且不能被其他人写入。

于 2016-04-22T13:47:36.417 回答
6

很多答案,一直在使用 sudo for yonks,但到目前为止还不需要自动化设置配置。我混合使用了上面的一些答案,将我的配置行写入 /etc/sudoers.d 包含位置,这样我就不必修改主 sudoers 文件,然后检查该文件的语法,简单示例如下:

将您的行写入 sudoers 包含文件:

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

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

sudo visudo -cf /etc/sudoers.d/99_sudo_include_file
于 2019-01-22T13:51:24.050 回答
5

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

sudo EDITOR=/path/to/my_dummy_editor.sh visudo
于 2008-11-27T15:22:25.573 回答
4

我认为最直接的解决方案是:

创建脚本addsudoers.sh

#!/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

问候!

于 2014-03-07T00:29:03.963 回答
3

这是我想出的解决方案。这是一个快速而肮脏的解决方案,但它确实有效......

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

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

于 2021-06-16T09:42:59.747 回答
2

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

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

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

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

于 2013-05-29T17:16:11.510 回答
0

尝试回应它。不过,您必须在子shell 中运行它。例子:

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

于 2014-06-18T17:50:50.883 回答
-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

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

sudo sh sudoersedit.sh

祝你好运:D

于 2013-03-13T21:41:02.020 回答