在OS X中编辑sudoers(10.7)

时间:2012-07-19 13:56:09

标签: macos sh sudoers

我有一个脚本(由我的前任编写),它在运行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”命令。为了我的理智,请不要让我捍卫这种安排的性质。这超出了我的控制范围。

2 个答案:

答案 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定义的任何编辑器。请注意,这可以   一个安全漏洞,因为它允许用户只需通过设置就可以执行他们想要的任何程序   视觉或编辑。

我怀疑这就是你在这里碰到的。