在OS X(10.7)中编辑sudoers

4

我有一个脚本(由我的前任编写),它成功地在运行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

然而,在运行Mac 10.7的计算机上,它不会将该行添加到sudoers文件中,而是“交互式”地启动了visudo。它似乎在任何时候都没有进入“else”子句。我怀疑第4行的适当语法(“export...”)已经改变,但我似乎找不到具体信息。有什么建议吗?
由于某些人可能会问:我们有一个复杂(而且可以说有点傻,但必要的)的强制重启计划来进行补丁安装。如果用户在最后期限前没有自愿重新启动,则应用程序将启动5分钟倒计时(或立即重新启动选项),此时将发出“sudo shutdown -r now”命令。出于我的健康考虑,请不要让我为这种安排的性质辩护。这超出了我的控制范围。

请翻译以下关于编程的内容,从英语到中文。只返回已翻译的文本: - jpdyson
2个回答

2

if [ -z "$1" ];是一种常见的习惯用语,用于检查脚本是否没有给出参数。当不带参数调用脚本时,您的脚本将采取第一条路径,启动编辑器(在这种情况下应该是脚本本身)。如果给定了文件名作为参数,则采取else分支,并在非交互方式下向文件追加一行(在visudo上下文中)。

假设脚本在没有参数的情况下被外部调用,sudo会开始清除EDIT环境变量,或者(如@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

在10.6和10.7中,/etc一直是指向/private/etc的符号链接,而sudoers文件就位于该目录下。我也尝试过指定为/private/etc/sudoers,但结果相同——打开了sudoers文件而不是编辑它。 - jpdyson
尝试直接运行echo“%staff ALL = NOPASSWD:/ sbin / shutdown”>> / private / etc / sudoers(当然,您可能需要成为root)。如果可以正常工作,请使用该单行替换对脚本的调用(即删除该命令周围的if,包括不需要的分支)。 - nobody
那个方法可以行得通,但可能不是最明智的,因为它绕过了visudo。我还没有提到我们使用Casper Suite来部署所有这些东西,它会将所有脚本都作为root运行,所以这不是问题。 - jpdyson
1
这不是我的理解。当通过visudo作为编辑器调用此脚本时,else分支将被运行。 - jpdyson
啊,时间真的很晚了。我最后一条评论(已删除)是胡言乱语,抱歉。>_> - nobody

1

visudo(8)的说明如下:

在编译时,visudo有一个硬编码的编辑器列表,其中包含一个或多个编辑器,可以通过sudoers默认变量覆盖。此列表默认为“/bin/vi”。通常情况下,visudo不会使用VISUAL或EDITOR环境变量,除非它们包含上述编辑器列表中的编辑器。但是,如果visudo配置了--with-env-editor选项或在sudoers中设置了env_editor默认变量,则visudo将使用由VISUAL或EDITOR定义的任何编辑器。请注意,这可能是一个安全漏洞,因为它允许用户通过设置VISUAL或EDITOR来执行任何程序。

我怀疑这就是你在这里遇到的问题。


我同意。我将深入研究这个问题,然而,为什么它在10.6中可以正常工作而在10.7中却出现问题是个谜。更复杂的是,我们的环境中10.6是一个全面的、单体式的镜像,而10.7更像是一个累加的版本。这可能是因为我们的10.6镜像做了一些其他的调整,使得EDITOR功能可以正常使用。 - jpdyson
进一步测试 - 在我的10.6机器上,我能够导出EDITOR=/path/to/script,使用echo进行验证,然后运行sudo visudo - 一切都如预期一样(sudoers文件被修改了)。我在10.7上也做了同样的事情,使用echo进行验证,但是当我运行sudo visudo时,编辑器环境变量明显被忽略了(它在vi中打开)。你的理论得到了证实。 - jpdyson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接