如何在 apt-get 的 sudoers 文件中指定 `-i` sudo 选项?

如何在 apt-get 的 sudoers 文件中指定 `-i` sudo 选项?

在我的单用户工作站上,我进行了配置sudoers(5),以便无需密码即可执行某些命令。具体来说,这是一个条目的示例:

$ cat /etc/sudoers.d/apt-get 
my_user_name ALL=(ALL) NOPASSWD: /usr/bin/apt-get

但是,我需要运行此命令sudo -i apt-get install(即选项-i)。

是否可以以某种方式修改配置文件,以便即使我简单地运行-i(即,sudosudo apt-get install没有 -i)?

(操作系统是 Ubuntu 14.04,但我认为这个问题并不特定于特定的 Linux 发行版。)

答案1

作为@穆鲁指出在一个评论sudo -i,在此场景中不需要登录 shell(即)(即 ) sudo apt-get ...。 sudoers 文件选项always_set_home就足够了(它将重置$HOME为 root 的主目录)。

sudoers 文件条目应如下所示:

$ sudo cat /etc/sudoers.d/apt-get
Defaults!/usr/bin/apt-get always_set_home
my_user_name ALL=(ALL) NOPASSWD: /usr/bin/apt-get

答案2

我假设您的交互式根外壳是/bin/bash(但要注意,也许您/etc/passwd设置了其他内容,例如/bin/dash)。

那么您真正想要的是从 运行 root 登录 shell sudo。正如我所说,我相信您通常不需要它。您还可以通过文件取消设置一些环境变量,或将它们设置为适当的默认值/etc/sudoers.d/apt-get

调用 Bash

-l

使该 shell 的行为就像是通过登录直接调用的一样。当 shell 是交互式的时,这相当于使用 启动登录 shell exec -l bash。当 shell 非交互式时,将执行登录 shell 启动文件。exec bash -l或者exec bash --login将用 Bash 登录 shell 替换当前 shell。有关登录 shell 的特殊行为的描述,请参阅 Bash 启动文件。

然后

登录 shell 的参数零的第一个字符是-,或者使用该--login选项调用。

因此,您可能可以编写一个 shell 脚本(或 C 语言的包装程序)来调用bash-l--login并在/etc/sudoers.d/apt-get

也许跑步/bin/bash -l -c "/usr/bin/apt-get $*"就足够了。

另请注意,sudoers(5)提到env_resetenv_keep

也许您只想删除一些环境变量,例如DBUS_SESSION_BUS_ADDRESS......

(我可能是错的,从来没有尝试过这个)

相关内容