Ubuntuでsudoが$ HOMEを変更しないように設定する方法と、この動作を無効にする方法は?


39

Ubuntu 12.04ではsudo -s、$ HOME変数が変更されないため、通常のユーザーがの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でrootに指定されたシェルは/bin/bashです。どちらのシステムでも、$ HOMEに関する限り、.profileor .bashrcファイルの違いがどこにあるかを見つけることができないため、の動作がsudo -s異なります。これに関する助けはありますか?


あなたは私の答えのコメントであなた自身の質問の一部に答えましたが、リンクunix.stackexchange.com/questions/38175/…をここに入れると思いました。Q3でのあなたの主張は、ログインシェルであるかどうかに関係なく、プロファイルとrcファイルを同じように設定する人もいるからだと思います。sudoDebianとUbuntu で動作が異なることはめったにないと思います。
msw

@msw DebianとUbuntu(12.04)の違いに関する限りsudo、実際にはデフォルトで違いがあると思います。しかし、私は他の誰かによってセットアップされ、かなり長い間実行されているボックスにいるので、それには賭けません。いずれにせよ、興味のある人なら誰でもsecurity.stackexchange.com/questions/18369/…bugs.launchpad.net/ubuntu/+source/sudo/+bug/760140を見つけました。
アルクス

回答:


51

Sudoには多くのコンパイル時構成オプションがあります。を使用して、バージョンの設定を一覧表示できますsudo -V。Debian wheezyの設定とUbuntu 12.04の設定の違いの1つは、HOME環境変数がUbuntuで保持されますが、Debianでは保持されないことです。どちらの分布も、保存しても安全であると明示的にマークされているいくつかを除き、すべての環境変数を消去します。したがって、Ubuntuではsudo -s保持さHOMEれますHOMEが、Debian では消去され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 -isudo最初のログインをシミュレートします。これにはHOME、ターゲットユーザーのホームディレクトリへの設定とログインシェルの呼び出しが含まれます


17

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

-iを意味し-Hます。
x-yuri

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オプションを介して実行するためにコマンドがシェルに渡されます。コマンドが指定されていない場合、対話型シェルが実行されます。


追加の詳細をありがとう、彼らは私のために物事をもう少し明確にしました。シェルの違いを確認する必要があると思います。これを読んで、誰のために、私と同じような状況で、このチェック:unix.stackexchange.com/questions/38175/...を
alxs

1
いいえ、sudoが変更されるかどうかHOMEは、sudoの構成方法に関係しています。
ジル 'SO-悪であるのをやめる'

@Gilles:では、sudoはどのように構成されていますか?では/etc/sudoers、$ HOMEに関する限り、DebianとUbuntuの間に違いはありません。
alxs

1
@alxs IIRC DebianとUbuntuには、異なるコンパイル時のデフォルトがあります。オプションalways_set_homeset_homeで上書きできますsudoers
ジル「SO-悪であるのをやめる」

@Gilles:ありがとう。それがまさに私が探している答えであり、これが起こる理由とそれを元に戻す方法の両方についてです。投稿しても構いませんが、回答として受け入れます。私は自分でそれをすることができましたが、私はそれを信用したくありません。
アルクス

2

ルートシェルを取得するための非常に一般的な方法も使用しています:

 $ sudo su - 
 # id
 uid=0(root) gid=0(root) groups=0(root)
 # pwd
 /root

私はを使用sudo -i -Hしていますが、gitからグローバルnpmパッケージをインストールすると失敗しました。それでsudo su -動作します!ありがとうございました。
ローラン

0

sudo -sUbuntuとDebianのそれぞれの異なる動作を取り除くには、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"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.