当前位置: 首页>>技术教程>>正文


sudo如何设置为在Ubuntu中不更改$HOME以及如何禁用此行为?

, ,

问题描述

在Ubuntu 12.04上,当我sudo -s时,$ HOME变量未更改,因此,如果我的常规用户是regularuser,情况将如下所示:

$ cd
$ pwd
/home/regularuser
$ sudo -s
# cd
# pwd
/home/regularuser

我很早以前就放弃了Ubuntu,所以不能确定,但​​是我认为这是默认行为。因此,我的问题是:

Q1。怎么做?配置在哪里?

Q2。如何禁用它?

编辑:感谢您的答案,这澄清了一些事情,但我想我必须添加几个问题,才能得到我想要的答案。

Q3。在Debian sudo -s中,将$ HOME变量更改为/root。从我从答案和man sudo中得到的信息来看,使用sudo -s运行的 shell 是/etc/passwd中给出的 shell ,对吗?

Q4。但是,在Ubuntu和Debian上,/etc/passwd给出的root shell 是/bin/bash。在这两个系统中,就$ HOME而言,我都找不到.profile.bashrc文件的区别所在,因此sudo -s的行为有所不同。有什么帮助吗?

最佳方法

Sudo具有许多compile-time配置选项。您可以使用sudo -V列出您版本中的设置。 Debian wheezy和Ubuntu 12.04中的配置之间的区别之一是HOME环境变量保留在Ubuntu中,但不保留在Debian中。除了明确标记为可以安全保存的几个环境变量外,这两个发行版都删除了所有环境变量。因此,sudo -s会在Ubuntu上保留HOME,而在Debian上会删除HOME,然后将sudo设置为目标用户的主目录。

您可以在sudoers文件中覆盖此行为。运行visudo以编辑sudoers文件。有几个相关选项:

  • env_keep确定保留哪些环境变量。使用Defaults env_keep += "HOME"保留呼叫者的HOME环境变量,或使用Defaults env_keep -= "HOME"擦除它(并将其替换为目标用户的主目录)。

  • env_reset确定是否完全重置环境变量。重置环境变量对于允许运行特定命令的规则通常是必需的,但是对于仍然允许运行任意命令的规则没有直接的安全优势。

  • 即使设置了always_set_home,也会导致HOME被覆盖,即使由于env_reset被禁用或HOMEenv_keep列表中而被保留。如果仍然不保留HOME,则此选项无效。

  • set_homealways_set_home类似,但仅适用于sudo -s,不适用于使用显式命令调用sudo的情况。

可以为给定的源用户,给定的目标用户或给定的命令设置这些选项。有关详细信息,请参见sudoers手册。

您始终可以通过传递选项-H选择对sudo的给定调用覆盖HOME

该 shell 程序将永远不会覆盖HOME的值。 (如果未设置,它将设置HOME,但是sudo始终以一种或另一种方式设置HOME。)

如果运行sudo -i,则sudo模拟初始登录。这包括将HOME设置为目标用户的主目录,并调用login shell

次佳方法

使用sudo -H -i代替sudo -s来获取交互式登录根shell:

sudo -H -i
cd
pwd -P  #  /private/var/root  (on Mac OS X 10.6.8)

man sudo

-H      The -H (HOME) option sets the HOME environment variable to
        the homedir of the target user (root by default) as
        specified in passwd(5).  By default, sudo does not modify
        HOME (see set_home and always_set_home in sudoers(5)).

第三种方法

这与sudo的行为无关,而与”login shell”和“非登录 shell ”之间的区别有关。快速修复是

$ sudo -i

可以看到:

$ sudo -s
# id
uid=0(root) gid=0(root) groups=0(root)
# echo $HOME
/home/msw
# exit
$ sudo -i
# echo $HOME
/root
# pwd
/root

如sudo手册中所述:

The -i (simulate initial login) option runs the shell specified by the password database entry of the target user as a login shell. This means that login-specific resource files such as .profile or .login will be read by the shell. If a command is specified, it is passed to the shell for execution via the shell’s -c option. If no command is specified, an interactive shell is executed.

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/9201.html,未经允许,请勿转载。