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

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

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

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

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

这个问题更多的是潜在的问题,而不是寻找有效的东西。

老线程,但是呢:

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

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

 #!/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”添加到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 

你应该把你的编辑做成一个临时文件,然后使用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 

在Debian和它的派生,你可以插入自定义脚本到/etc/sudoers.d/目录,权利0440 – 欲了解更多信息,请参阅/etc/sudoers.d/README 。

这可能有帮助。

visudo应该是编辑/etc/sudoers的人机界面。 你可以通过直接replace文件来达到同样的效果,但是你必须小心并发编辑和语法validation。 注意r--r-----权限。

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

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

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

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

这将确保新文件进行validation并正确安装权限更新。

请注意,如果/tmp/sudoers.new文件中有错误,则visudo将提示用户input,因此build议先使用visudo -c -f /tmp/sudoers.new进行检查。

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

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

基本上你使用visudo来validation文件,然后再将它复制到sudoers.d中,这样你就可以确定你没有打破任何人的sudo。

 visudo -c -q -f filename 

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

我认为最直接的解决scheme是:

创build一个脚本addsudoers.sh

 #!/bin/bash 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"

这对我来说是基于别人在这里发布的。 当我使用其他人民的脚本它会打开visudo对我来说,但不会做编辑。 这使得编辑我需要允许所有的用户,包括标准的用户,安装java 7u17 safari / firefox。

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

这增加了每个人等等等等等等等文件的底部。 我必须像这样运行脚本。

 sudo sh sudoersedit.sh 

祝你好运:D