我需要从脚本编辑/etc/sudoers
以添加/删除白名单中的内容。
假设我有一个可以在普通文件上运行的命令,我怎么能将它应用到/etc/sudoers
?
我可以复制和修改它,然后让visudo
用修改过的副本替换原件吗?在$EDITOR
中提供我自己的脚本?
或者我可以使用相同的锁和cp
吗?
问题更多的是关于潜在的问题,而不仅仅是找到有用的东西。
答案 0 :(得分:115)
旧帖子,但是怎么样:
echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo
答案 1 :(得分:42)
使用自定义编辑器为此使用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结束时添加“对Ddo更改为#dummy”这一行。没有黑客,没有竞争条件。
带注释的版本,解释了这实际上是如何工作的:
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
答案 2 :(得分:29)
您应该对临时文件进行编辑,然后使用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
答案 3 :(得分:12)
在Debian及其衍生品上,您可以将自定义脚本插入/etc/sudoers.d/
目录,权限为0440
- 有关详细信息,请参阅/etc/sudoers.d/README。
这可能会有所帮助。
答案 4 :(得分:8)
visudo应该是编辑/etc/sudoers
的人机界面。您可以通过直接替换文件来实现相同目的,但您必须自己关注并发编辑和语法验证。注意r--r-----
权限。
答案 5 :(得分:6)
如果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拥有,而不是由其他人写的。
答案 6 :(得分:5)
设置自定义编辑器。基本上它将是一个接受文件名的脚本(在本例中为/etc/sudoers.tmp),并修改并保存到位。所以你可以写出那个文件。完成后退出脚本,visudo将负责为您修改实际的sudoers文件。
sudo EDITOR=/path/to/my_dummy_editor.sh visudo
答案 7 :(得分:3)
很多答案,与yons一起使用sudo进行,但直到现在都不需要自动化设置配置。 我混合使用了上面的一些答案,将配置行写到/etc/sudoers.d包含位置,这样我就不必修改主sudoers文件,然后检查该文件的语法,下面是简单的示例:< / p>
将您的行写到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
答案 8 :(得分:2)
只是为上面的答案添加另一个选项,如果竞争条件不是主要问题,那么可以使用以下命令来避免手动将修改后的文件复制到/etc/sudoers
sudo EDITOR="cp /tmp/sudoers.new" visudo
这将确保通过权限更新验证并正确安装新文件。
请注意,如果/tmp/sudoers.new
文件中存在错误,则visudo
会提示用户输入,因此建议先使用visudo -c -f /tmp/sudoers.new
进行检查。
答案 9 :(得分:1)
我认为最直接的解决方案是:
创建脚本 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
有关完整说明,请参阅此答案:Adding users to sudoers through shell script
问候!
答案 10 :(得分:1)
这是我想出的解决方案。这是一个快速而肮脏的解决方案,但它有效......
echo "username ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers
它将 echo 输出通过管道传输到在 sudo 下运行的 tee 中。然后 Tee 将输出附加到 sudoers 文件中。
答案 11 :(得分:0)
尝试回应它。但是,您必须在子shell中运行它。例如:
sudo sh -c "echo \"group ALL=(user) NOPASSWD: ALL\" >> /etc/sudoers"
答案 12 :(得分:-1)
根据其他人在这里发布的内容,这对我有用。当我使用其他人的脚本时,它会为我打开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
这增加了所有人的百分比等等等等到sudoers文件的底部。 我必须像这样运行脚本。
sudo sh sudoersedit.sh
祝你好运:D