問題描述
在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.