问题描述
在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
被禁用或HOME
在env_keep
列表中而被保留。如果仍然不保留HOME
,则此选项无效。 -
set_home
与always_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.