Ubuntu で sudo が $HOME を変更しないように設定するにはどうすればよいでしょうか。また、この動作を無効にするにはどうすればよいですか。

Ubuntu で sudo が $HOME を変更しないように設定するにはどうすればよいでしょうか。また、この動作を無効にするにはどうすればよいですか。

Ubuntu 12.04 では、sudo -s$HOME 変数は変更されないため、通常のユーザーが の場合regularuser、状況は次のようになります。

$ cd
$ pwd
/home/regularuser
$ sudo -s
# cd
# pwd
/home/regularuser

私はずっと前に Ubuntu を放棄したので、確信はありませんが、これがデフォルトの動作だと思います。そこで、私の質問は次のとおりです。

  1. これはどうやって行うのですか? 設定はどこにありますか?
  2. 無効にするにはどうすればいいですか?

編集: 回答をありがとうございます。少しは状況が明確になりましたが、私が求めている答えを得るには、いくつか質問を追加する必要があると思います。

  1. Debian ではsudo -s、 $HOME 変数が に変更されます/root。回答から得た情報と、man sudo実行されたシェルは でsudo -s指定されたものです/etc/passwdよね?
  2. /etc/passwdしかし、Ubuntu と Debian の両方で、の root に指定されているシェルは です。どちらのシステムでも、$HOME に関する限り、またはファイル/bin/bashの違いがどこにあるのかがわかりません。そのため、 の動作が異なります。これについて何か助言はありますか?.profile.bashrcsudo -s

答え1

Sudo には、コンパイル時の設定オプションが多数あります。 を使用して、お使いのバージョンの設定を一覧表示できますsudo -V。Debian wheezy と Ubuntu 12.04 の設定の違いの 1 つは、HOME環境変数が Ubuntu では保持されるのに、Debian では保持されないことです。両方のディストリビューションは、明示的に保持しても安全であるとマークされているいくつかの環境変数を除いて、すべての環境変数を消去します。したがって、Ubuntu ではsudo -sが保持されますが、Debian ではが消去されてから、対象ユーザーのホーム ディレクトリに設定されます。HOMEHOMEsudo

この動作は、sudoersファイル。実行しvisudoてファイルを編集しますsudoers。関連するオプションがいくつかあります。

  • env_keepどの環境変数を保持するかを決定します。Defaults env_keep += "HOME"呼び出し元のHOME環境変数を保持するか、またはDefaults env_keep -= "HOME"それを消去して (ターゲット ユーザーのホーム ディレクトリに置き換えるか) に使用します。
  • env_reset環境変数をリセットするかどうかを決定します。環境変数のリセットは、特定のコマンドの実行を許可するルールでは必要な場合が多いですが、任意のコマンドの実行を許可するルールでは直接的なセキュリティ上の利点はありません。
  • always_set_homeが設定されている場合、無効になっているかリスト内にあるHOMEために保持されていたとしても、 は上書きされます。 が保持されていない場合、このオプションは効果がありません。env_resetHOMEenv_keepHOME
  • set_homeは と似ていますalways_set_homeが、 にのみ適用され、明示的なコマンドでsudo -s呼び出す場合には適用されません。sudo

これらのオプションは、特定のソース ユーザー、特定のターゲット ユーザー、または特定のコマンドに対して設定できます。sudoers詳細についてはマニュアルを参照してください。

オプションを渡すことによりHOME、特定の呼び出しに対してオーバーライドをいつでも選択できます。sudo-H

シェルは の値を上書きすることはありません。(設定されていない場合はHOME設定されますが、常に何らかの方法で設定されます。)HOMEsudoHOME

を実行するとsudo -isudo初期ログインをシミュレートします。これには、HOMEターゲットユーザーのホームディレクトリへの設定と、ログインシェル

答え2

対話型ログイン ルート シェルを取得するにsudo -H -iは、 の代わりにを使用します。sudo -s

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

答え3

これは、の動作とはほとんど関係なく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 (初期ログインをシミュレート) オプションは、対象ユーザーのパスワード データベース エントリで指定されたシェルをログイン シェルとして実行します。つまり、.profile や .login などのログイン固有のリソース ファイルがシェルによって読み取られます。コマンドが指定されている場合は、シェルの -c オプションを介してシェルに渡され、実行されます。コマンドが指定されていない場合は、対話型シェルが実行されます。

答え4

Ubuntu と Debian でのの異なる動作を解消するにはsudo -s、ラッパーを使用できます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"

関連情報