web-dev-qa-db-ja.com

UbuntuとDebianはSudo権限を持つユーザーの$ HOMEをどのように管理しますか?

私はbashスクリプトを持っていますmyhome.shは1行のみを含みます:

echo $HOME

スクリプトの所有者はユーザーです。

$ ls -l myhome.sh
-rw-rw-r-- 1 user user <date> <time> myhome.sh

buntu 16.04と17.1で:

$ echo $HOME
/home/user

$ Sudo echo $HOME
/home/user

$ bash myhome.sh
/home/user

$ Sudo bash myhome.sh
/home/user

Debian Buster/Testingで得ます:

$ echo $HOME
/home/user

$ Sudo echo $HOME
/home/user

$ bash myhome.sh
/home/user

# WHY ?
$ Sudo bash myhome.sh
/root

Debianのスクリプト内でなぜSudoで実行された場合、常に$HOME=/root Ubuntuで$HOME=/home/user。 Ubuntu開発者が何を変更したか知っている人はいますか?

38
ceccoemi

DebianとUbuntuはどちらも、環境変数をリセットする/etc/sudoersを含むDefaults env_resetファイルを出荷しています。

ただし、env_resetの動作は、$ HOMEをしないから、ターゲットユーザーのホームにリセットするように変更されました。

Ubuntuは以前の動作を維持するためにSudoのバージョンにパッチを適用することを決定しました: https://bugs.launchpad.net/ubuntu/+source/Sudo/+bug/76014

Ubuntuでは、$ HOME環境変数をターゲットユーザーにリセットするために、Defaults always_set_homeまたはDefaults set_home(この場合、Sudo -sのみがHOMEを更新する)を設定する必要があります。 /etc/sudoers

Ubuntuトラッカーのこのバグは、Sudoで$ HOMEを設定しないことの根拠をいくつか持っています: https://bugs.launchpad.net/ubuntu/+source/Sudo/+bug/1373495

コメント#4を参照してください。

HOMEが削除された場合、たとえばvim、bashなどは、ユーザーの〜/ .vimrc、〜/ .bashrcなどではなく、/ root/.vimrc、/ root/.bashrcなどを使用します。Sudoを介してXクライアントを実行することは悪い考えですが、それらも構成ファイルの誤った場所を調べる可能性が高く、誤った.Xauthorityファイルを狙った場合、X11クライアントがX11サーバーに接続できない可能性もあります。

これは、Ubuntu開発者による意識的な決定です。

この回答には、always_set_homeなどのsudoersオプションの詳細があります: https://unix.stackexchange.com/a/91572/281844


あなたの質問には2番目の問題があります。それはSudo echo $HOMEで、Debianでもユーザーの家を表示します。

これは、シェルがSudoコマンドを実行する前に$HOMEを展開しているために発生します。

したがって、この:

$ Sudo echo $HOME

シェルによって最初に展開されます:

$ Sudo echo /home/user

そしてSudoはrootとしてecho /home/userを実行します...

これも違いを示すはずです:

$ Sudo bash -c 'echo $HOME'
/root

または、完全なルートシェルを取得して、そこで環境変数を確認します。

$ Sudo -s
# echo $HOME
/root
67
filbranden