$ whoami
admin
$ sudo -S -u otheruser whoami
otheruser
$ sudo -S -u otheruser /bin/bash -l -c 'echo $HOME'
/home/admin
Mengapa tidak $HOME
disetel /home/otheruser
meskipun bash dipanggil sebagai shell login?
Secara khusus, /home/otheruser/.bashrc
tidak bersumber. Juga, /home/otheruser/.profile
tidak bersumber. - ( /home/otheruser/.bash_profile
tidak ada)
bash
sudo
environment-variables
pengguna80551
sumber
sumber
Jawaban:
Untuk memohon shell login
sudo
hanya menggunakan-i
. Ketika perintah tidak ditentukan Anda akan mendapatkan prompt shell login, jika tidak, Anda akan mendapatkan output dari perintah Anda.Contoh (shell login):
Contoh (dengan pengguna yang ditentukan):
Contoh (dengan perintah):
Contoh (pengguna cetak
$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
--login
dan dengan perintah yang ditentukan, seperti pada panggilan eksplisit Anda ke bash, tetapi di samping itu sudo dapat melakukan pekerjaannya sendiri seperti mengatur$HOME
.Saya perhatikan bahwa Anda menggunakan
-S
dan 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 berfungsilocalhost
baik untuk host lain dan menyediakan otentikasi kunci publik yang berfungsi tanpa input interaktif apa pun.Catatan: Anda tidak memerlukan opsi khusus dengan SSH karena server SSH selalu membuat shell login untuk diakses oleh klien SSH.
sumber
sudo -i -u user echo \$HOME
tidak bekerja untuk saya. Output:$HOME
. strace memberikan hasil yang sama seperti milik Anda. apa masalahnya?Anda memberi Bash terlalu banyak pujian. Semua "login shell" berarti Bash adalah file-file apa yang bersumber pada saat startup dan shutdown. The
$HOME
variabel 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
$HOME
sama sekali.$HOME
diatur oleh apapun yang memanggil shell (login, ssh, dll.), dan shell mewarisinya. Apa pun yang memulai shell Anda sebagai admin ditetapkan$HOME
dan kemudian dijalankanbash
,sudo
dengan desain tidak mengubah lingkungan kecuali diminta atau dikonfigurasi untuk melakukannya, sehinggabash
pengguna lain mewarisinya dari shell Anda.Jika Anda ingin
sudo
menangani lebih banyak lingkungan dengan cara yang Anda harapkan, lihat-i
sakelar untuk sudo. Mencoba:Halaman manual untuk sudo menggambarkannya lebih terinci, meskipun tidak terlalu baik, saya pikir: http://linux.die.net/man/8/sudo
sumber
/bin/bash -l -c 'echo $HOME'
sendiri baris perintah saat menggunakan-i
.sudo
sintaks melemparkan kesalahan pada mesin saya. (su
menggunakan-c
opsi, tapi saya rasasudo
tidak.) Saya lebih beruntung dengan:HomeDir=$( sudo -u "$1" -H -s echo "\$HOME" )
-S
(saya tidak membutuhkannya, jadi saya meninggalkannya), tetapi-c
tidak bekerja di sini, Anda membutuhkannya-s
.