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

alx*_*lxs 45 ubuntu sudo environment-variables

在 Ubuntu 12.04 上,当我sudo -s的 $HOME 变量没有改变时,如果我的普通用户是regularuser,情况是这样的:

$ cd
$ pwd
/home/regularuser
$ sudo -s
# cd
# pwd
/home/regularuser
Run Code Online (Sandbox Code Playgroud)

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

一季度。这是怎么做的?配置在哪里?

Q2。如何禁用它?

编辑: 感谢您的回答,这使事情澄清了一点,但我想我必须添加几个问题,以获得我正在寻找的答案。

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

第 4 季度。但是,在 Ubuntu 和 Debian 上,/etc/passwd为 root提供的 shell都是/bin/bash. 在任一系统中,就 $HOME 而言,我找不到.profile.bashrc文件的差异在哪里,因此行为sudo -s不同。这有什么帮助吗?

Gil*_*il' 62

Sudo 有许多编译时配置选项。您可以使用 列出您版本中的设置sudo -V。Debian wheezy 和 Ubuntu 12.04 中配置的区别之一是HOME环境变量在 Ubuntu 中保留,但在 Debian 中不保留;两个发行版都会删除所有环境变量,除了一些明确标记为可以安全保存的变量。因此在 Ubuntu 上sudo -s保留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_home类似于always_set_home,但仅适用于sudo -s,不适sudo用于使用显式命令调用时。

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

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

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

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


小智 17

使用sudo -H -i而不是sudo -s获取交互式登录 root shell:

sudo -H -i
cd
pwd -P  #  /private/var/root  (on Mac OS X 10.6.8)
Run Code Online (Sandbox Code Playgroud)

来自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)).
Run Code Online (Sandbox Code Playgroud)


msw*_*msw 5

这与sudo“登录外壳”和“非登录外壳”之间的区别几乎没有关系,但有很大关系。快速修复是

$ sudo -i
Run Code Online (Sandbox Code Playgroud)

可以看出:

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

如 sudo 手册中所述:

-i(模拟初始登录)选项运行由目标用户的密码数据库条目指定的 shell 作为登录 shell。这意味着 shell 将读取特定于登录名的资源文件,例如 .profile 或 .login。如果指定了命令,则会通过 shell 的 -c 选项将其传递给 shell 以执行。如果未指定命令,则执行交互式 shell。