如何从脚本编辑/ 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