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の両方でルートシェルは同じです。どちらのシステムも$ 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
使用できます(質問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"