/ etc / sudoers —仅为一个命令指定env_keep?


23

有什么方法可以指定sudo只为指定的命令保留某些环境变量吗?出于某些目的,我想要我的环境$HOME。运行某些命令时保留的变量。为了其他目的和其他命令,我希望将其重置。可以做到/etc/sudoers吗?

编辑:

谢谢你的回答。我想知道是否可以问一个后续问题,那就是“为什么,这不起作用?”

在我尝试开始工作的示例中,我想sudo nano阅读我的$HOME/.nanorc。如果我使用这个:

Defaults:simon env_keep=HOME

它完美地工作。如果我使用这个:

Defaults!/bin/nano env_keep=HOME

或这个:

Cmnd_Alias      NANO = /usr/bin/nano,/bin/nano,/bin/rnano
Defaults!NANO   env_keep=HOME

它根本不起作用。有什么建议吗?(顺便说一下,我正在进行Debian测试。)

(注意:nano顺便说一句,我不认为这很具体-我可以使用单行bash脚本echos 来重现该行为$HOME)。


1
与其尝试使sudo运行nano以使用相同的配置文件,不如使用sudoeditsudoedit会运行将文件的内容复制到tmp文件,然后以用户的身份运行您选择的编辑器,当编辑器退出时,它将检查您是否进行了任何更改,如果已更改,则将原始内容替换为已编辑的内容。您可以通过设置$EDITOR或$ VISUAL`环境变量来选择要运行的编辑器。
Arrowmaster

@Arrowmaster-谢谢,这似乎是一种比我正在弄乱的方法更好的方法。因为我已经在包装sudo自己的函数,所以我只添加了一个if [ "$1" == "$EDITOR" ]; then块,现在sudoedit改为调用:)
simon

Answers:


21

env_keep仅针对/path/to/command(当通过任何规则被任何用户调用时)和针对该用户joe(无论他运行什么命令)覆盖:

Defaults!/path/to/command env_keep=HOME
Defaults:joe env_keep=HOME

您可以使用-=+=删除条目或将其添加到env_keep列表中。


太好了,谢谢。我找不到该语法的正确示例。既然您已经为我说清楚了,那么我可以从man页面上看到我应该如何解决它,而且我感到有些愚蠢。毫无疑问,这个答案也会帮助其他人。
西蒙,

1
@simon:别傻了,我也发现sudoers手册页中的语法描述很难从正式描述中得出,如果您已经知道如何编写示例,则更容易找到示例。
吉尔(Gilles)'所以

嗯-也许我很快就讲了。现在,我尝试了一下,但实际上无法使它正常工作。我可以麻烦您看看我的修订吗?
西蒙,

1
@simon:我的猜测是您还有一个条目,可以执行所有操作,并且没有该env_keep设置(simon ALL = ALL)。Sudo使用最后一个匹配的条目。
吉尔(Gilles)'所以

注意,如果设置了secure_path,则还必须添加Defaults:joe!secure_path
Jistanidiot

6
Cmnd_Alias      PBUILDER = /usr/sbin/pbuilder,/usr/sbin/cowbuilder
Defaults!PBUILDER       env_keep+=HOME

这些行是我自己写的,/etc/sudoers可以纠正pbuilder寻找$HOME其用户配置文件的问题,但必须以root用户身份运行(将其移动到/root某种程度会破坏同时拥有系统和用户配置文件的目的)。


是的,这与我所想到的用例非常相似,谢谢!
西蒙,

您是否知道为什么我的修订中的示例似乎不起作用?
西蒙,

@simon sudo对配置中的条目顺序非常挑剔,以后的条目将覆盖以前的条目。在您的配置中可能会有类似的冲突。
Arrowmaster

1

sudoers:

   env_reset       If set, sudo will reset the environment to only contain
                   the LOGNAME, SHELL, USER, USERNAME and the SUDO_*
                   variables.  Any variables in the caller’s environment
                   that match the env_keep and env_check lists are then
                   added.  The default contents of the env_keep and
                   env_check lists are displayed when sudo is run by root
                   with the -V option.  If the secure_path option is set,
                   its value will be used for the PATH environment
                   variable.  This flag is on by default.

所以,是的,你可以做到这一点使用env_resetenv_keepenv_check在你的/ etc / sudoers文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.