perintah sudo tidak sumber /root/.bashrc

27

Saya telah menambahkan jalur khusus ke PATHvariabel dalam file /root/.bashrc saya

Ketika saya melakukannya sudo su; echo $PATH, ini menunjukkan entri, '/ path / ke / custom / bins'.

Tapi saya lakukan sudo sh -c 'echo $PATH', itu menunjukkan, /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Jalur folder yang ditambahkan dalam file .bashrc tidak terlihat.

Bukankah perintah sudo memiliki lingkungan yang sama dengan pengguna root?


sumber

Jawaban:

32

.bashrcadalah file konfigurasi bash, hanya ketika dijalankan secara interaktif. Ini hanya dimuat ketika Anda memulai bash, bukan ketika Anda menjalankan beberapa program lain seperti sh(bahkan jika bash dipanggil melalui nama sh). Dan itu hanya dimuat saat bash bersifat interaktif, bukan saat menjalankan skrip atau perintah -c.

sudo sh -c 'echo $PATH'atau sudo bash -c 'echo $PATH'tidak menggunakan shell interaktif, jadi .bashrctidak terlibat.

sudo su; echo $PATHmenjalankan instance interaktif shell root. Jika itu bash, maka ~root/.bashrcdimuat. Cuplikan ini dieksekusi echo $PATHsetelah shell interaktif ini berakhir, jadi apa pun yang terjadi di shell interaktif tidak memiliki pengaruh pada apa yang dicetak snippet di akhir. Tetapi jika Anda mengetik echo $PATHpada prompt shell interaktif yang dimulai oleh sudo su, Anda akan melihat nilai yang ditentukan oleh ~root/.bashrc.

Karena .bashrcdipanggil di setiap shell interaktif, bukan oleh shell login (bahkan oleh shell login interaktif, yang merupakan cacat desain di bash), itu adalah tempat yang salah untuk mendefinisikan variabel lingkungan. Gunakan .bashrcuntuk pengaturan bash interaktif seperti binding kunci, alias dan pengaturan penyelesaian. Setel variabel lingkungan dalam file yang dimuat saat Anda masuk: ~/.pam_environmentatau ~/.profile.

Jadi mengatur PATHdi .profilebukannya .bashrc, dan baik menjalankan shell login dengan sudo -i 'echo $PATH', atau secara eksplisit sumber .profiledengan sudo sh -c '. ~/.profile; echo $PATH'.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
telah membahas banyak hal yang relevan tentang kerang .... terima kasih ....
1
Bagaimana cara menambahkannya .profile? Apakah maksud Anda /root/.profileatau /home/user/.profile? Saya mencoba menambahkan export PATH=$PATH:/mydirkeduanya. Tidak bekerja Saya mencoba tanpa export, itu juga tidak berhasil.
falsePockets
@falsePockets Tidak berfungsi untuk apa? Anda harus mengajukan pertanyaan baru dan menjelaskan apa yang Anda lakukan.
Gilles 'SANGAT berhenti menjadi jahat'
Hal yang tidak berhasil adalah hal yang persis sama yang OP coba lakukan. Saya mencoba menambahkan direktori ke PATH dari pengguna super saya. Saya seharusnya tidak mengajukan pertanyaan baru, karena pertanyaan itu akan menjadi duplikat dari pertanyaan ini.
falsePockets
@falsePockets Tapi ternyata Anda tidak melakukan hal yang sama untuk mencapai akun pengguna super. Dan karena Anda tidak mengatakan apa yang Anda lakukan, saya tidak dapat membantu Anda selain mengulangi apa yang sudah ada dalam jawaban saya.
Gilles 'SANGAT berhenti menjadi jahat'
14

Lihatlah opsi -Edan -i.

-E: Menunjukkan kebijakan keamanan yang ingin dipertahankan pengguna dari variabel lingkungan yang ada. Kebijakan keamanan dapat mengembalikan kesalahan jika pengguna tidak memiliki izin untuk melestarikan lingkungan.

-i: Jalankan 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 tersebut diteruskan ke shell untuk dieksekusi melalui opsi -c shell. Jika tidak ada perintah yang ditentukan, shell interaktif dijalankan. sudo mencoba mengubah ke direktori home pengguna tersebut sebelum menjalankan shell. Perintah dijalankan dengan lingkungan yang mirip dengan yang akan diterima pengguna saat masuk. Bagian lingkungan Perintah di sudoers (5) mendokumentasikan bagaimana opsi -i mempengaruhi lingkungan di mana perintah dijalankan ketika kebijakan sudoers dijalankan. digunakan.

Vinz
sumber
3

Anda bisa sudo bash, yang membaca bashfile startup seperti yang didokumentasikan di bashhalaman manual / dokumentasi. Harap dicatat, bahwa itu mungkin tidak mengatur HOMEvariabel lingkungan dengan benar. Ini dapat diperbaiki dalam bashfile startup di seluruh sistem (di /etc, lokasi yang tepat tergantung pada distro) - uji apakah $uid0.

Ned64
sumber