Bagaimana cara Ubuntu dan Debian mengelola $ HOME untuk pengguna dengan hak istimewa sudo?

38

Saya memiliki skrip bash myhome.shyang hanya berisi satu baris:

echo $HOME

Pemilik skrip adalah pengguna:

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

Di Ubuntu 16.04 dan 17.10 saya mendapatkan:

$ echo $HOME
/home/user

$ sudo echo $HOME
/home/user

$ bash myhome.sh
/home/user

$ sudo bash myhome.sh
/home/user

Di Debian Buster / Testing saya mendapatkan:

$ echo $HOME
/home/user

$ sudo echo $HOME
/home/user

$ bash myhome.sh
/home/user

# WHY ?
$ sudo bash myhome.sh
/root

Saya tidak mengerti mengapa di dalam skrip di Debian, jika dijalankan dengan sudo, saya selalu dapatkan $HOME=/rootdi Ubuntu $HOME=/home/user. Adakah yang tahu apa yang telah diubah oleh pengembang Ubuntu?

ceccoemi
sumber

Jawaban:

67

Baik Debian dan Ubuntu mengirimkan /etc/sudoersfile yang berisi Defaults env_reset, yang me-reset variabel lingkungan.

Namun, perilaku env_resettelah diubah dari tidak menyentuh $ HOME untuk mengatur ulang ke rumah pengguna target.

Ubuntu memutuskan untuk menambal versi mereka sudountuk menjaga perilaku sebelumnya: https://bugs.launchpad.net/ubuntu/+source/sudo/+bug/760140

Di Ubuntu, untuk mereset variabel lingkungan $ HOME ke pengguna target, kita harus mengatur salah satu Defaults always_set_homeatau Defaults set_home(dalam hal ini hanya sudo -sakan mendapatkan HOME diperbarui) di dalamnya /etc/sudoers.

Bug ini di pelacak Ubuntu memiliki beberapa alasan lagi untuk tidak menetapkan $ HOME di sudo: https://bugs.launchpad.net/ubuntu/+source/sudo/+bug/1373495

Lihat komentar # 4:

Jika HOME dihapus, maka mis. Vim, bash, dll., Akan menggunakan /root/.vimrc, /root/.bashrc, dll daripada pengguna ~ / .vimrc, ~ / .bashrc, dll. Meskipun itu adalah ide yang buruk untuk menjalankan klien X melalui sudo, mereka juga kemungkinan akan mencari lokasi yang salah untuk file konfigurasi, dan ada kemungkinan klien X11 bahkan tidak dapat terhubung ke server X11 jika mereka diarahkan pada file .Xauthority yang salah.

Ini adalah keputusan sadar oleh pengembang Ubuntu.

Jawaban ini memiliki detail lebih lanjut tentang opsi sudoers seperti always_set_home: https://unix.stackexchange.com/a/91572/281844


Ada masalah kedua dalam pertanyaan Anda, sudo echo $HOMEyang masih menampilkan rumah pengguna bahkan di Debian.

Itu terjadi karena shell berkembang $HOME sebelum menjalankan sudoperintah.

Jadi ini:

$ sudo echo $HOME

Pertama kali diperluas oleh shell ke:

$ sudo echo /home/user

Dan kemudian sudo dieksekusi echo /home/usersebagai root ...

Ini harus menunjukkan perbedaannya juga:

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

Atau dapatkan shell root lengkap dan lihat variabel lingkungan di sana:

$ sudo -s
# echo $HOME
/root
filbranden
sumber