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


39

在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运行的shell sudo -s是给定的/etc/passwd,对吗?

Q4。但是,在Ubuntu和Debian上/etc/passwd,root用户指定的shell 是/bin/bash。在这两个系统中,就$ HOME而言,我都找不到文件.profile.bashrc文件中的差异所在的位置,从而使行为sudo -s不同。有什么帮助吗?


您在对我的答案的评论中回答了自己的问题的一部分,但我认为我应该在此处放置链接unix.stackexchange.com/questions/38175/…。我认为您在第三季度提出的主张是因为某些人将其个人资料和rc文件设置为具有相同的行为,而不管它们是否位于登录外壳中。我认为sudo在Debian和Ubuntu之间表现出不同的行为几乎是不可能的。
msw

@msw至于Debian和Ubuntu(12.04)之间的区别sudo,我认为默认情况下确实存在区别。但是,我不敢打赌,因为我在一个盒子上,这个盒子已经由其他人设置,并且已经运行了一段时间。无论如何,对于感兴趣的任何人,我都可以找到security.stackexchange.com/questions/18369/…bugs.launchpad.net/ubuntu/+source/sudo/+bug/760140
alxs 2013年

Answers:


51

Sudo具有许多编译时配置选项。您可以使用列出您版本中的设置sudo -V。Debian wheezy和Ubuntu 12.04中的配置之间的差异之一是HOME环境变量保留在Ubuntu中,但不保留在Debian中。除少数几个明确标记为可以安全保存的环境变量外,这两个发行版都删除了所有环境变量。因此sudo -s保留HOME在Ubuntu上,而在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有关详细信息,请参见手册。

您始终可以通过传递option 选择覆盖HOME给定的呼叫。sudo-H

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

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


17

使用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)).

-i暗示-H
x-yuri

5

这与sudo“登录外壳”和“非登录外壳”之间的行为无关,而与它的行为密切相关。快速修复是

$ 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手册中所述:

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


感谢您提供额外的详细信息,他们为我澄清了一些事情。猜猜我必须检查壳之间的区别。:对于任何人读这篇文章,与我相同的情况下,检查了这unix.stackexchange.com/questions/38175/...
alxs

1
不,sudo是否更改HOME与sudo的配置有关。
吉尔斯(Gillles)“所以-别再邪恶了”

@Gilles:那么,sudo是如何配置的?在中/etc/sudoers,就$ HOME而言,Debian和Ubuntu之间没有什么不同。
alxs

1
@alxs IIRC Debian和Ubuntu具有不同的编译时默认值。您可以使用always_set_homeset_home中的选项覆盖它们sudoers
吉尔(Gilles)'所以

@吉尔斯:谢谢。这正是我正在寻找的答案,无论是为什么会发生以及如何还原它。如果您不介意将其发布,我将接受它作为答案。我自己可以做,但是我不想为此功劳。
alxs

2

获取根shell的非常流行的方法还使用:

 $ sudo su - 
 # id
 uid=0(root) gid=0(root) groups=0(root)
 # pwd
 /root

我曾经使用过sudo -i -H,但是从git安装全局npm软件包失败。有了sudo su -它的作品!谢谢。
洛朗

0

要摆脱sudo -s分别在Ubuntu和Debian上的不同行为,可以使用sudo包装器(对Q4的回答):

sudos() {
   local PATH="$(getconf PATH)" root_homedir
   root_homedir="$(sudo -H sh -c 'printf "%s" "$HOME"')"
   sudo sh -c 'export HOME="$0"; exec sh -i' "$root_homedir"
   return 0
}

sudo -k
sudos
{
logname
whoami
id -un
id -ur
echo "PATH: $PATH"
}
exit
echo "PATH: $PATH"
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.