我需要/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
该脚本会将“# Dummy change to sudoers”这一行添加到 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、基于 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
其中即可。确保它由 root 拥有并且不能被其他人写入。
很多答案,一直在使用 sudo for yonks,但到目前为止还不需要自动化设置配置。我混合使用了上面的一些答案,将我的配置行写入 /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
设置自定义编辑器。基本上,它将是一个接受文件名的脚本(在本例中为 /etc/sudoers.tmp),然后对其进行修改和保存。所以你可以写出那个文件。完成后,退出脚本,visudo 会为您修改实际的 sudoers 文件。
sudo EDITOR=/path/to/my_dummy_editor.sh visudo
我认为最直接的解决方案是:
创建脚本addsudoers.sh
#!/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 "username ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers
它将 echo 输出通过管道传输到在 sudo 下运行的 tee 中。然后 Tee 将输出附加到 sudoers 文件中。
只是为了在上面的答案中添加一个进一步的选项,如果竞争条件不是主要问题,那么可以使用以下命令来避免手动将修改后的文件复制到/etc/sudoers
sudo EDITOR="cp /tmp/sudoers.new" visudo
这将确保新文件通过权限更新得到验证和正确安装。
/tmp/sudoers.new
请注意,如果文件中有错误,visudo
则会提示用户输入,因此建议先检查它visudo -c -f /tmp/sudoers.new
。
尝试回应它。不过,您必须在子shell 中运行它。例子:
sudo sh -c "echo \"group ALL=(user) NOPASSWD: ALL\" >> /etc/sudoers"
根据其他人在此处发布的内容,这对我有用。当我使用其他人的脚本时,它会为我打开 visudo 但不会进行编辑。这使得我需要进行编辑以允许所有用户(包括标准用户)为 safari/firefox 安装 java 7u17。
#!/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
这将 %everyone blah blah blah 添加到 sudoers 文件的底部。我不得不像这样运行脚本。
sudo sh sudoersedit.sh
祝你好运:D