當前位置: 首頁>>技術教程>>正文


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/zh-tw/article/9201.html,未經允許,請勿轉載。