sudo sebagai pengguna lain dengan lingkungannya

56

$ whoami
admin
$ sudo -S -u otheruser whoami
otheruser
$ sudo -S -u otheruser /bin/bash -l -c 'echo $HOME'
/home/admin

Mengapa tidak $HOMEdisetel /home/otherusermeskipun bash dipanggil sebagai shell login?

Secara khusus, /home/otheruser/.bashrctidak bersumber. Juga, /home/otheruser/.profiletidak bersumber. - ( /home/otheruser/.bash_profiletidak ada)

pengguna80551
sumber
Solusi untuk pertanyaan ini juga akan menyelesaikan pertanyaan lain, Anda mungkin ingin menghapus pertanyaan lain dalam situasi ini.
Pavel Šimerda

Jawaban:

83

Untuk memohon shell login sudohanya menggunakan -i. Ketika perintah tidak ditentukan Anda akan mendapatkan prompt shell login, jika tidak, Anda akan mendapatkan output dari perintah Anda.

Contoh (shell login):

sudo -i

Contoh (dengan pengguna yang ditentukan):

sudo -i -u user

Contoh (dengan perintah):

sudo -i -u user whoami

Contoh (pengguna cetak $HOME):

sudo -i -u user echo \$HOME

Catatan: Karakter backslash memastikan bahwa tanda dolar mencapai shell pengguna target dan tidak ditafsirkan dalam shell pengguna panggilan.

Saya baru saja memeriksa contoh terakhir dengan strace yang memberi tahu Anda apa yang sebenarnya terjadi. Output di bawah ini menunjukkan bahwa shell sedang dipanggil dengan --logindan dengan perintah yang ditentukan, seperti pada panggilan eksplisit Anda ke bash, tetapi di samping itu sudo dapat melakukan pekerjaannya sendiri seperti mengatur $HOME.

# strace -f -e process sudo -S -i -u user echo \$HOME
execve("/usr/bin/sudo", ["sudo", "-S", "-i", "-u", "user", "echo", "$HOME"], [/* 42 vars */]) = 0
...
[pid 12270] execve("/bin/bash", ["-bash", "--login", "-c", "echo \\$HOME"], [/* 16 vars */]) = 0
...

Saya perhatikan bahwa Anda menggunakan -Sdan saya pikir itu umumnya bukan teknik yang baik. Jika Anda ingin menjalankan perintah sebagai pengguna yang berbeda tanpa melakukan otentikasi dari keyboard, Anda mungkin ingin menggunakan SSH sebagai gantinya. Ini berfungsi localhostbaik untuk host lain dan menyediakan otentikasi kunci publik yang berfungsi tanpa input interaktif apa pun.

ssh user@localhost echo \$HOME

Catatan: Anda tidak memerlukan opsi khusus dengan SSH karena server SSH selalu membuat shell login untuk diakses oleh klien SSH.

Pavel Šimerda
sumber
2
sudo -i -u user echo \$HOMEtidak bekerja untuk saya. Output: $HOME. strace memberikan hasil yang sama seperti milik Anda. apa masalahnya?
John_West
Tidak tahu, itu masih berfungsi untuk saya, saya harus melihatnya atau mungkin bahkan menyentuh sistem.
Pavel Šimerda
10

Anda memberi Bash terlalu banyak pujian. Semua "login shell" berarti Bash adalah file-file apa yang bersumber pada saat startup dan shutdown. The $HOMEvariabel tidak mencari ke dalamnya.

Bash docs menjelaskan beberapa lagi apa artinya shell login: https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files

Bahkan, Bash tidak melakukan apa pun untuk mengatur $HOMEsama sekali. $HOMEdiatur oleh apapun yang memanggil shell (login, ssh, dll.), dan shell mewarisinya. Apa pun yang memulai shell Anda sebagai admin ditetapkan $HOMEdan kemudian dijalankan bash, sudodengan desain tidak mengubah lingkungan kecuali diminta atau dikonfigurasi untuk melakukannya, sehingga bashpengguna lain mewarisinya dari shell Anda.

Jika Anda ingin sudomenangani lebih banyak lingkungan dengan cara yang Anda harapkan, lihat -isakelar untuk sudo. Mencoba:

sudo -S -u otheruser -i /bin/bash -l -c 'echo $HOME'

Halaman manual untuk sudo menggambarkannya lebih terinci, meskipun tidak terlalu baik, saya pikir: http://linux.die.net/man/8/sudo

Jeff Snider
sumber
4
$ HOME tidak diatur oleh bash - Terima kasih, saya tidak tahu itu.
user80551
Carilah strace dalam jawaban saya. Ini menunjukkan bahwa Anda tidak perlu membangun /bin/bash -l -c 'echo $HOME'sendiri baris perintah saat menggunakan -i.
Pavel Šimerda
1
Bahwa sudosintaks melemparkan kesalahan pada mesin saya. ( sumenggunakan -copsi, tapi saya rasa sudotidak.) Saya lebih beruntung dengan:HomeDir=$( sudo -u "$1" -H -s echo "\$HOME" )
palswim
ya, @palswim benar. Tidak yakin tentang -S(saya tidak membutuhkannya, jadi saya meninggalkannya), tetapi -ctidak bekerja di sini, Anda membutuhkannya -s.
polynomial_donut