Ubuntu 12.04では、$ HOME変数がSudo -s
変更されていないため、通常のユーザーがregularuser
の場合、状況は次のようになります。
$ cd
$ pwd
/home/regularuser
$ Sudo -s
# cd
# pwd
/home/regularuser
私はずっと前にUbuntuを放棄したので確信が持てませんが、これはデフォルトの動作だと思います。だから、私の質問は:
Q1。これはどのように行われますか?設定はどこにありますか?
Q2。どうすれば無効にできますか?
編集:回答をありがとうございました。少し明確になりましたが、私が探している回答を得るには、いくつか質問を追加する必要があると思います。
Q3。 Debian Sudo -s
では、$ HOME変数を/root
に変更します。私が答えから得たものから、man Sudo
で実行されたSudo -s
シェルは/etc/passwd
で与えられたものですよね?
Q4。ただし、UbuntuとDebianの両方で、ルートの/etc/passwd
で指定されたシェルは/bin/bash
です。どちらのシステムでも、$ HOMEに関する限り、.profile
または.bashrc
ファイルの違いがどこにあるかを見つけることができないため、Sudo -s
の動作が異なります。これについて何か助けはありますか?
Sudoには、多くのコンパイル時構成オプションがあります。 Sudo -V
を使用して、バージョンの設定を一覧表示できます。 Debian wheezyとUbuntu 12.04の構成の違いの1つは、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
が設定されている場合、env_reset
が無効になっているため、またはHOME
がenv_keep
リスト内にあるために保存されていても、HOME
が上書きされます。 HOME
が保存されていない場合、このオプションは効果がありません。set_home
はalways_set_home
に似ていますが、Sudo -s
にのみ適用され、明示的なコマンドでSudo
を呼び出す場合は適用されません。これらのオプションは、特定のソースユーザー、特定のターゲットユーザー、または特定のコマンドに対して設定できます。詳細については、sudoers
マニュアルを参照してください。
オプション-H
を渡すことにより、HOME
への特定の呼び出しに対して常にSudo
をオーバーライドすることを選択できます。
シェルがHOME
の値をオーバーライドすることはありません。 (未設定の場合はHOME
が設定されますが、Sudo
は常にHOME
を何らかの方法で設定します。)
Sudo -i
を実行すると、Sudo
は初期ログインをシミュレートします。これには、HOME
をターゲットユーザーのホームディレクトリに設定し、 ログインシェル を呼び出すことが含まれます。
使用する 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)).
これは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オプションを介して実行するためにコマンドがシェルに渡されます。コマンドが指定されていない場合、対話型のシェルが実行されます。
ルートシェルを取得する非常に人気のある方法も使用しています:
$ Sudo su -
# id
uid=0(root) gid=0(root) groups=0(root)
# pwd
/root
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"