Bagaimana sudo diatur untuk tidak mengubah $ HOME di Ubuntu dan bagaimana menonaktifkan perilaku ini?

39

Di Ubuntu 12.04, ketika saya sudo -svariabel $ HOME tidak berubah, jadi jika pengguna reguler saya regularuser, situasinya seperti ini:

$ cd
$ pwd
/home/regularuser
$ sudo -s
# cd
# pwd
/home/regularuser

Saya telah meninggalkan Ubuntu sejak lama, jadi saya tidak yakin, tapi saya pikir ini adalah perilaku default. Jadi, pertanyaan saya adalah:

Q1. Bagaimana ini dilakukan? Di mana konfigurasi?

Q2. Bagaimana cara menonaktifkannya?

Sunting: Terima kasih atas jawabannya, yang sedikit memperjelas beberapa hal, tapi saya rasa saya harus menambahkan beberapa pertanyaan, untuk mendapatkan jawaban yang saya cari.

Q3. Di Debian sudo -s, ubah variabel $ HOME ke /root. Dari apa yang saya dapatkan dari jawaban dan man sudoshell berlari dengan sudo -syang diberikan /etc/passwd, kan?

Q4. Namun, pada Ubuntu dan Debian shell yang diberikan /etc/passwduntuk root adalah /bin/bash. Di kedua sistem juga, saya tidak dapat menemukan di mana perbedaan dalam .profileatau .bashrcfile, sejauh $ HOME yang bersangkutan, sehingga perilaku sudo -sberbeda. Ada bantuan untuk ini?

alxs
sumber
Anda menjawab sebagian dari pertanyaan Anda sendiri dalam komentar atas jawaban saya, tetapi saya pikir saya akan meletakkan tautan unix.stackexchange.com/questions/38175/… di sini. Saya pikir klaim Anda di Q3 adalah karena beberapa orang mengatur profil dan file rc mereka untuk bertindak sama terlepas dari apakah mereka berada di shell login atau tidak. Saya pikir sangat tidak mungkin sudoberperilaku berbeda antara Debian dan Ubuntu.
msw
@ msw Sejauh perbedaan antara Debian dan Ubuntu (12,04) sudoberjalan, saya pikir memang ada perbedaan secara default. Namun, saya tidak bertaruh untuk itu, karena saya berada di kotak yang telah diatur oleh orang lain dan telah berjalan cukup lama. Bagaimanapun, bagi siapa pun yang tertarik, saya menemukan security.stackexchange.com/questions/18369/… dan bugs.launchpad.net/ubuntu/+source/sudo/+bug/760140 .
alxs

Jawaban:

51

Sudo memiliki banyak opsi konfigurasi waktu kompilasi. Anda dapat mencantumkan pengaturan dalam versi Anda dengan sudo -V. Salah satu perbedaan antara konfigurasi di Wheezy Debian dan di Ubuntu 12,04 adalah bahwa HOMEvariabel lingkungan dipertahankan di Ubuntu tetapi tidak di Debian; kedua distribusi menghapus semua variabel lingkungan kecuali untuk beberapa yang secara eksplisit ditandai sebagai aman untuk dilestarikan. Dengan demikian sudo -smempertahankan HOMEpada Ubuntu, sedangkan pada Debian HOMEdihapus dan sudokemudian menetapkannya ke direktori home dari pengguna target.

Anda bisa mengganti perilaku ini di sudoersfile. Jalankan visudountuk mengedit sudoersfile. Ada beberapa opsi yang relevan:

  • env_keepmenentukan variabel lingkungan mana yang dilestarikan. Gunakan Defaults env_keep += "HOME"untuk mempertahankan HOMEvariabel lingkungan pemanggil atau Defaults env_keep -= "HOME"untuk menghapusnya (dan menggantinya dengan direktori home dari pengguna target).
  • env_resetmenentukan apakah variabel lingkungan disetel ulang sama sekali. Mengatur ulang variabel lingkungan sering diperlukan untuk aturan yang memungkinkan menjalankan perintah tertentu, tetapi tidak memiliki manfaat keamanan langsung untuk aturan yang memungkinkan menjalankan perintah sewenang-wenang.
  • always_set_home, jika disetel, menyebabkan HOMEpengesampingan meskipun dipertahankan karena env_resetdinonaktifkan atau HOMEada dalam env_keepdaftar. Opsi ini tidak memiliki efek jika HOMEtidak dipertahankan.
  • set_homeseperti always_set_home, tetapi hanya berlaku untuk sudo -s, bukan saat memanggil sudodengan perintah eksplisit.

Opsi-opsi ini dapat diatur untuk pengguna sumber tertentu, target pengguna tertentu atau perintah yang diberikan; lihat sudoersmanual untuk detailnya.

Anda selalu dapat memilih untuk mengganti HOMEpanggilan yang diberikan sudodengan melewati opsi -H.

Shell tidak akan pernah menimpa nilai HOME. (Ini akan mengatur HOMEjika tidak disetel, tetapi sudoselalu menetapkan HOMEsatu atau lain cara.)

Jika Anda menjalankan sudo -i, sudomensimulasikan login awal. Ini termasuk pengaturan HOMEke direktori home pengguna target dan menggunakan shell login .

Gilles 'SANGAT berhenti menjadi jahat'
sumber
17

Gunakan sudo -H -ialih-alih sudo -suntuk mendapatkan shell root login interaktif:

sudo -H -i
cd
pwd -P  #  /private/var/root  (on Mac OS X 10.6.8)

Dari 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)).
franco
sumber
-itersirat -H.
x-yuri
5

Ini tidak ada hubungannya dengan perilaku sudodan banyak hubungannya dengan perbedaan antara "shell login" dan "shell non-login". Perbaikan cepat adalah

$ sudo -i

seperti yang bisa dilihat dengan:

$ sudo -s
# id
uid=0(root) gid=0(root) groups=0(root)
# echo $HOME
/home/msw
# exit
$ sudo -i
# echo $HOME
/root
# pwd
/root

Seperti tercantum dalam manual sudo:

Opsi -i (mensimulasikan login awal) menjalankan shell yang ditentukan oleh entri basis data kata sandi pengguna target sebagai shell login. Ini berarti bahwa file sumber daya khusus masuk seperti .profile atau .login akan dibaca oleh shell. Jika suatu perintah ditentukan, perintah itu diteruskan ke shell untuk dieksekusi melalui opsi -c shell. Jika tidak ada perintah yang ditentukan, shell interaktif dijalankan.

msw
sumber
Terima kasih atas perincian ekstra, mereka mengklarifikasi hal-hal yang sedikit lebih bagi saya. Kira saya harus memeriksa perbedaan antara shell. Bagi siapa pun yang membaca ini, dalam situasi yang sama dengan saya, periksa ini: unix.stackexchange.com/questions/38175/…
alxs
1
Tidak, apakah sudo berubah HOMEatau tidak ada hubungannya dengan bagaimana sudo dikonfigurasi.
Gilles 'SO- stop being evil'
@Gilles: Jadi, bagaimana sudo dikonfigurasi? Dalam /etc/sudoers, tidak ada yang berbeda antara Debian dan Ubuntu sejauh $ HOME yang bersangkutan.
alxs
1
@alxs IIRC Debian dan Ubuntu memiliki standar waktu kompilasi yang berbeda. Anda dapat menimpanya dengan opsi always_set_homedan set_homemasuk sudoers.
Gilles 'SO- stop being evil'
@Gilles: Terima kasih. Itulah jawaban yang saya cari, baik pada mengapa ini terjadi dan bagaimana mengembalikannya. Jika Anda tidak keberatan mempostingnya, saya akan menerimanya sebagai jawabannya. Saya bisa melakukannya sendiri, tetapi saya tidak ingin mengambil kredit untuk itu.
alxs
2

Cara yang cukup populer untuk mendapatkan shell root juga menggunakan:

 $ sudo su - 
 # id
 uid=0(root) gid=0(root) groups=0(root)
 # pwd
 /root
Satanowski
sumber
Saya menggunakan untuk digunakan sudo -i -H, tetapi gagal dengan menginstal paket global npm dari git. Dengan sudo su -itu berhasil! Terima kasih.
Laurent
0

Untuk menghilangkan perilaku berbeda sudo -sdi Ubuntu dan Debian masing-masing, Anda bisa menggunakan sudopembungkus (jawaban untuk 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"
tacz
sumber