私は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開発者が何を変更したか知っている人はいますか?
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