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

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

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変数をに変更します/rootman sudo回答から得た内容と実行したシェルはsudo -sに記載されています/etc/passwd
  2. /etc/passwdただし、UbuntuとDebianの両方でルートシェルは同じです。どちらのシステムも$ HOMEに関する限り、違いやファイルが/bin/bash見つからないため、動作は異なります。.profileこれに役立ちますか?.bashrcsudo -s

答え1

Sudoには多くのコンパイル時設定オプションがあります。お使いのバージョンに記載されている設定を使用できますsudo -V。 Debian wheezy と Ubuntu 12.04 の設定の違いの 1 つは、HOME環境変数が Ubuntu では維持されますが Debian では維持されないことです。両方のディストリビューションは、安全に保管するために明示的に示されているいくつかの環境変数を除いて、すべての環境変数を削除します。そのため、Ubuntuには残りますが、sudo -sDebianでは削除され、ターゲットユーザーのホームディレクトリに設定されます。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。 (HOME設定されていない場合は設定されますが、sudo常にHOME何らかの方法で設定されます。)

を実行すると、sudo -i初期sudoログインがシミュレートされます。これには、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使用できます(質問4の答え)。sudo

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"

関連情報