
Ubuntu 12.04 では、sudo -s
$HOME 変数は変更されないため、通常のユーザーが の場合regularuser
、状況は次のようになります。
$ cd
$ pwd
/home/regularuser
$ sudo -s
# cd
# pwd
/home/regularuser
私はずっと前に Ubuntu を放棄したので、確信はありませんが、これがデフォルトの動作だと思います。そこで、私の質問は次のとおりです。
- これはどうやって行うのですか? 設定はどこにありますか?
- 無効にするにはどうすればいいですか?
編集: 回答をありがとうございます。少しは状況が明確になりましたが、私が求めている答えを得るには、いくつか質問を追加する必要があると思います。
- Debian では
sudo -s
、 $HOME 変数が に変更されます/root
。回答から得た情報と、man sudo
実行されたシェルは でsudo -s
指定されたものです/etc/passwd
よね? /etc/passwd
しかし、Ubuntu と Debian の両方で、の root に指定されているシェルは です。どちらのシステムでも、$HOME に関する限り、またはファイル/bin/bash
の違いがどこにあるのかがわかりません。そのため、 の動作が異なります。これについて何か助言はありますか?.profile
.bashrc
sudo -s
答え1
Sudo には、コンパイル時の設定オプションが多数あります。 を使用して、お使いのバージョンの設定を一覧表示できますsudo -V
。Debian wheezy と Ubuntu 12.04 の設定の違いの 1 つは、HOME
環境変数が Ubuntu では保持されるのに、Debian では保持されないことです。両方のディストリビューションは、明示的に保持しても安全であるとマークされているいくつかの環境変数を除いて、すべての環境変数を消去します。したがって、Ubuntu ではsudo -s
が保持されますが、Debian ではが消去されてから、対象ユーザーのホーム ディレクトリに設定されます。HOME
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
詳細についてはマニュアルを参照してください。
オプションを渡すことにより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
、ラッパーを使用できます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"