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

n-a*_*der 107 linux shell sudo

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

假设我有一个可以在普通文件上运行的命令,我该如何应用它/etc/sudoers

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

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

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

小智 131

旧线程,但是怎么样:

echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案.整个子shell应该以root身份执行,例如`echo"$ USER ALL = NOPASSWD:/ usr/bin/rsync"| (sudo su -c'EDITOR ="tee"visudo -f /etc/sudoers.d/rsync')`. (8认同)
  • 我只想指出@BorisDäppen的答案的一个重要细微差别:`-a`标志为`EDITOR ="tee"`:它会将行附加到文件中,而不仅仅覆盖第一行.起初我没有发现不同的东西,我无法想出追加的方式.我希望我可以通过直接指向某些人找到一些人;-) (3认同)
  • 有人可以解释一下我的意思是不是在EDITOR ='tee -a'之后需要的分号.我知道这会破坏命令.EDITOR是一个shell变量,visudo是另一个命令,因此我们在同一命令行中传递EDITOR和visudo.这真的有用吗? (3认同)
  • 这个答案非常好!我用它来debian包中的postinst skripts.谢谢!因为它总是root,所以它变得简单和方便:`echo"$ CONFIGLINE"| (EDITOR ="tee -a"visudo)` (2认同)
  • 为了防止重复记录: `if [ -z "$(grep 'foobar ALL=(ALL:ALL) ALL' /etc/sudoers )" ]; 然后 echo "foobar ALL=(ALL:ALL) ALL" | sudo EDITOR='tee -a' visudo; 菲;` (2认同)

sst*_*dal 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
Run Code Online (Sandbox Code Playgroud)

这个脚本会在sudoers结束时添加"#dummy change 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
Run Code Online (Sandbox Code Playgroud)

  • 这要求sudo已经用`--enable-env-editor`编译,否则它只会使用尊重编辑器变量,如果它是一小组已知值之一. (5认同)

Bri*_*ane 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
Run Code Online (Sandbox Code Playgroud)

  • 需要使用lockfile而不是test/touch (2认同)
  • 手册页说它使用/tmp/sudoers.tmp,因此目前是标准。当然,将来可能会改变。是的,你是对的,有比赛条件。 (2认同)

pev*_*vik 15

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

它可能有所帮助.

  • 我也在centos 7中使用该目录 (3认同)
  • @TomDworzanski:恕我直言 见[man sudoers(5)](http://www.sudo.ws/man/1.8.15/sudoers.man.html#x4f74686572207370656369616c206368617261637465727320616e6420726573657276656420776f726473)和[其他评论](http://unix.stackexchange.com/questions/244064 /为什么-是最包括和 - 了includedir-指令功能于须藤前缀与 - 在磅). (2认同)

ngn*_*ngn 10

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


Mne*_*quo 6

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

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

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

visudo -c -q -f filename
Run Code Online (Sandbox Code Playgroud)

这将检查并返回成功(0),如果它是有效的,所以你可以使用它if,&&和其他脚本布尔运算.一旦验证,只需将其复制到/etc/sudoers.d它应该工作.确保它由root拥有,而不是由其他人写的.


Im-*_*Cus 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'
Run Code Online (Sandbox Code Playgroud)

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

sudo visudo -cf /etc/sudoers.d/99_sudo_include_file
Run Code Online (Sandbox Code Playgroud)


Ali*_*har 5

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

sudo EDITOR=/path/to/my_dummy_editor.sh visudo
Run Code Online (Sandbox Code Playgroud)


Ada*_*icz 5

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

echo "username ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers
Run Code Online (Sandbox Code Playgroud)

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