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

时间:2008-11-27 14:47:12

标签: linux shell sudo

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

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

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

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

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

13 个答案:

答案 0 :(得分:115)

旧帖子,但是怎么样:

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

答案 1 :(得分:42)

使用自定义编辑器为此使用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

此脚本会在sudoers结束时添加“对Ddo更改为#dummy”这一行。没有黑客,没有竞争条件。

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

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

答案 2 :(得分:29)

您应该对临时文件进行编辑,然后使用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

答案 3 :(得分:12)

在Debian及其衍生品上,您可以将自定义脚本插入/etc/sudoers.d/目录,权限为0440 - 有关详细信息,请参阅/etc/sudoers.d/README

这可能会有所帮助。

答案 4 :(得分:8)

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

答案 5 :(得分:6)

如果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拥有,而不是由其他人写的。

答案 6 :(得分:5)

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

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

答案 7 :(得分:3)

很多答案,与yons一起使用sudo进行,但直到现在都不需要自动化设置配置。 我混合使用了上面的一些答案,将配置行写到/etc/sudoers.d包含位置,这样我就不必修改主sudoers文件,然后检查该文件的语法,下面是简单的示例:< / p>

将您的行写到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

答案 8 :(得分:2)

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

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

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

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

答案 9 :(得分:1)

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

创建脚本 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

有关完整说明,请参阅此答案:Adding users to sudoers through shell script

问候!

答案 10 :(得分:1)

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

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

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

答案 11 :(得分:0)

尝试回应它。但是,您必须在子shell中运行它。例如:

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

答案 12 :(得分:-1)

根据其他人在这里发布的内容,这对我有用。当我使用其他人的脚本时,它会为我打开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文件的底部。 我必须像这样运行脚本。

sudo sh sudoersedit.sh
祝你好运:D