我有一个脚本(由我的前任编写),它在运行OS X 10.6的Mac上成功编辑了sudoers文件;它是这样的:
#!/bin/sh
if [ -z "$1" ]; then
export EDITOR=$0 && sudo -E visudo
else
echo "%staff ALL=NOPASSWD: /sbin/shutdown" >> $1
fi
但是,当在运行10.7的Mac上运行时,不是将该行添加到sudoers文件中,而是“以交互方式”启动visudo。它似乎在任何时候都没有输入“else”子句。我怀疑第4行(“export ...”)的相应语法已经改变,但我似乎无法弄清楚如何。有什么指针吗?
因为有人会问:我们有一个精心设计(并且无可否认,有些愚蠢,但必然如此)强制重启计划进行修补。如果用户未在截止日期前故意重新启动,则应用程序将在5分钟倒计时(或立即重启的选项)启动,此时将发出“sudo shutdown -r now”命令。为了我的理智,请不要让我捍卫这种安排的性质。这超出了我的控制范围。
答案 0 :(得分:2)
if [ -z "$1" ];
是一种常见的习惯用法,用于检查脚本是否没有参数。当调用不带参数时,您的脚本将采用第一个路径,启动编辑器(在本例中应该是此脚本本身)。 将文件名作为参数,将采用else
- 分支,并以非交互方式(在visudo
上下文中)将一行附加到文件中。
假设在没有参数的情况下从外部调用脚本,sudo开始清除EDITOR环境变量,或者(正如@twalberg所说)visudo现在忽略了EDITOR。
要修复,请调整sudoers文件以保留EDITOR,并通过设置env_editor
允许任何程序作为编辑器,或者将脚本(以及编辑sudoers文件的任何其他脚本)添加到editor
变量
Defaults env_keep += "EDITOR"
# UNSAFE
#Defaults env_editor
# better
Defaults editor = "/usr/bin/vi:/path/to/script" # ... possibly more
如果您不想这样做(或者不能以非交互方式进行)并且可以安全地假设不会同时进行编辑,则可以执行以下操作:
cp -p /etc/sudoers /etc/sudoers.tmp
echo "%staff ALL=NOPASSWD: /sbin/shutdown" >> /etc/sudoers.tmp
if visudo -cqf /etc/sudoers.tmp; then
mv /etc/sudoers.tmp /etc/sudoers
else
rm /etc/sudoers.tmp
echo "update failed"
fi
答案 1 :(得分:1)
visudo(8)
有这样的说法:
有一个硬编码的一个或多个编辑器列表,visudo将在编译时使用set 可以通过编辑器覆盖默认变量。此列表默认为 “/ bin中/六”。通常,visudo不尊重VISUAL或EDITOR环境变量 除非它们包含上述编辑列表中的编辑器。但是,如果是visudo 使用--with-env-editor选项配置或设置env_editor默认变量 sudoers,visudo将使用VISUAL或EDITOR定义的任何编辑器。请注意,这可以 一个安全漏洞,因为它允许用户只需通过设置就可以执行他们想要的任何程序 视觉或编辑。
我怀疑这就是你在这里碰到的。