我需要/etc/sudoers
从脚本编辑以添加/删除白名单中的内容.
假设我有一个可以在普通文件上运行的命令,我该如何应用它/etc/sudoers
?
我可以复制和修改它,然后visudo
用修改过的副本替换原件吗?通过提供我自己的脚本$EDITOR
?
或者我可以使用相同的锁和cp
?
问题更多的是关于潜在的问题,而不仅仅是找到有用的东西.
旧线程,但是怎么样:
echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo
使用自定义编辑器使用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
您应该对临时文件进行编辑,然后使用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
.您可以通过直接替换文件来实现相同目的,但您必须自己关注并发编辑和语法验证.注意r--r-----
权限.
如果您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拥有,而不是由其他人写的.
设置自定义编辑器.基本上它将是一个接受文件名的脚本(在本例中为/etc/sudoers.tmp),并修改并保存到位.所以你可以写出那个文件.完成后,退出脚本,visudo将负责为您修改实际的sudoers文件.
sudo EDITOR=/path/to/my_dummy_editor.sh visudo