我需要从一个脚本中编辑/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
--enable-env-editor
参数编译 sudo,否则它只会在编辑器变量设置为少数几个已知值之一时才使用。 - Calebsudo -E
。 - merlin2011你应该在一个临时文件上进行编辑,然后使用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、Redhat、openSUSE等)中,您可以将自定义脚本插入到/etc/sudoers.d/
目录中,并赋予其0440
权限-有关更多信息,请参见man sudo
(“从sudo内部包含其他文件”)或官方网站上的相同信息。
这可能会有所帮助。
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
中,然后它应该就能正常工作了。确保它归根所有且不可被其他人写入。
有很多答案,一直使用sudo工具,但直到现在才需要自动化设置配置。 我使用了上面某些答案的混合方式,将我的配置行写入/etc/sudoers.d包含位置的文件中,这样我就不必修改主sudoers文件,然后检查该文件的语法,以下是一个简单的示例:
将您的行写入sudoers包含文件中:
sudo bash -c 'echo "your_user ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/99_sudo_include_file'
检查您的sudoers包含文件是否通过visudo语法检查:
sudo visudo -cf /etc/sudoers.d/99_sudo_include_file
echo "username ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers
它将echo输出导入到在sudo下运行的tee中。然后,Tee将输出附加到sudoers文件中。
设置自定义编辑器。基本上,它将是一个脚本,接受文件名(在本例中为/etc/sudoers.tmp),并在原地修改和保存该文件。因此,您可以直接写入该文件。完成后,退出脚本,visudo会负责为您修改实际的sudoers文件。
sudo EDITOR=/path/to/my_dummy_editor.sh visudo
#!/bin/sh; echo "# my changes to sudoers" >> $1; exit 0
对我来说似乎可以工作。 - MountainX#!/bin/sh
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
祝好!
echo "$USER ALL=NOPASSWD:/usr/bin/rsync" | (sudo su -c 'EDITOR="tee" visudo -f /etc/sudoers.d/rsync')
。 - simonecho "$CONFIGLINE" | (EDITOR="tee -a" visudo)
。 - Boris DäppenEDITOR="tee"
的-a
标志:它将附加行到文件中,而不仅仅是覆盖第一行。起初我没有注意到这个区别,也无法找到追加的方法。我希望通过直接指出这一点能够帮助其他人;-) - Jean-Philippe Murrayif [ -z "$(grep 'foobar ALL=(ALL:ALL) ALL' /etc/sudoers )" ]; then echo "foobar ALL=(ALL:ALL) ALL" | sudo EDITOR='tee -a' visudo; fi;
- muratgozel