当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何从脚本编辑/etc/sudoers?》经验,为你挑选了7个好方法。

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

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

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

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

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



1> 小智..:

旧线程,但是怎么样:

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


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

2> sstendal..:

使用自定义编辑器使用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结束时添加"#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


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

3> Brian C. Lan..:

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


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

4> pevik..:

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

它可能有所帮助.


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

5> ngn..:

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



6> Mnebuerquo..:

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



7> Ali Afshar..:

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

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

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有