Pada fedora VM saya, ketika menjalankan dengan akun pengguna saya, saya ada /usr/local/bin
di jalur saya:
[justin@justin-fedora12 ~]$ env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin
Dan juga saat menjalankan su
:
[justin@justin-fedora12 ~]$ su -
Password:
[root@justin-fedora12 justin]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin
Namun, ketika dijalankan melalui sudo
, direktori ini tidak ada di jalur:
[root@justin-fedora12 justin]# exit
[justin@justin-fedora12 ~]$ sudo bash
[root@justin-fedora12 ~]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin
Mengapa jalurnya berbeda saat berjalan via sudo
?
sudo
$ PATH?Jawaban:
Lihatlah
/etc/sudoers
. File default di Fedora (juga di RHEL, dan juga Ubuntu dan yang serupa) termasuk baris ini:Yang memastikan bahwa jalur Anda bersih saat menjalankan binari di bawah sudo. Ini membantu melindungi dari beberapa masalah yang dicatat dalam pertanyaan ini . Ini juga nyaman jika Anda tidak memiliki
/sbin
dan/usr/sbin
di jalur Anda sendiri.sumber
/usr/local/bin
ke direktif ini maka saya akan melihatnya di jalur saya ketika menjalankan viasudo
, kan?/usr/local/bin
. Terima kasih banyak untuk menjelaskan ini!sudo
misalnya skrip di~/bin
(atau jalur apa pun yang Anda gunakan)? Saya baru saja membuat perubahan - itu berhasil, hanya berpikir mungkin ada sisi lain dari itu?Perintah ini
su -
akan mengeksekusi profil pengguna root dan mengambil lingkungan pengguna itu termasuk jalur dll.sudo
Tidak melakukan itu.Jika Anda ingin
sudo
bersikap sepertisu -
maka gunakan opsisudo -i [command
yang akan mengeksekusi profil penggunaJika Anda ingin
su -
bersikap sepertisudo
itu jangan gunakan tanda hubung - cukup gunakansu [command]
sumber
Anda dapat memeriksa mengapa (berbeda) dengan menjalankan
sudo sudo -V
.Misalnya di Linux dijalankan:
Catatan: Pada MacOS / BSD, hanya menjalankan:
sudo sudo -V
.Daftar di atas dibatasi karena plugin kebijakan keamanan default di beberapa distribusi Linux.
Ini dijelaskan lebih lanjut dalam
man sudoers
:Jika itu masalahnya, Anda dapat mengubahnya dengan menjalankan
sudo visudo
dan mengedit file konfigurasi dan memodifikasi Andasecure_path
(menambahkan jalur tambahan yang dipisahkan oleh:
) atau menambahkan pengguna Anda keexempt_group
(sehingga Anda tidak akan terpengaruh olehsecure_path
opsi).Atau untuk lulus
PATH
sementara dari pengguna , Anda dapat menjalankan:dan Anda dapat memeriksanya dengan:
Lihat juga: Bagaimana cara
sudo
melestarikan$PATH
?Alasan lain mengapa lingkungan bisa berbeda
sudo
, adalah karena Anda dapatenv_reset
mengaktifkan opsi disudoers
file Anda . Ini menyebabkan perintah dijalankan dengan lingkungan minimal baru.Jadi, Anda dapat menggunakan
env_keep
opsi (tidak disarankan karena alasan keamanan ) untuk melindungi variabel lingkungan pengguna Anda:sumber
Di sebagian besar linux, Anda menginstal program melalui manajemen paket, dan mendapatkan pembaruan secara teratur. Jika Anda menginstal sesuatu yang mengelak dari manajemen paket, ia akan diinstal di / usr / local / bin (misalnya, atau ... / sbin, atau / opt) dan tidak mendapatkan pembaruan rutin.
Karena itu saya kira program-programnya tidak dianggap seaman itu, dan tidak memasukkan PATH ke root secara default.
sumber
sudo
mengecualikan direktori ini secara default.Saya baru saja mencoba ini untuk diri saya sendiri dan saya tidak melihat perilaku yang Anda lihat - jalur saya tetap sama, jadi mungkin konfigurasi sudo Anda berbeda. Jika Anda memeriksa,
man sudoers
Anda akan melihat ada opsi yang disebutsecure_path
resetPATH
- sepertinya opsi ini telah diaktifkan.sumber
Karena ketika Anda menggunakan
sudo bash
,bash
jangan bertindak sebagai shell login. Coba lagi dengansudo bash -l
dan Anda akan melihat hasil yang sama dengansu -
.Jika itu benar, maka perbedaan
PATH
terletak pada file konfigurasi:/etc/profile
,~/.bash_profile
,~/.bash_login
,~/.profile
dieksekusi (agar) untuk login shell, sedangkan~/.bashrc
dijalankan untuk shell interaktif non-login.sumber
Pertanyaan lama, saya tahu, tetapi saya tersandung di sini karena saya sedang menyelidiki masalah yang sebenarnya ini.
Untuk beberapa alasan
/usr/local/bin
hanya ada di PATH ketika menjadi root viasudo su -
. Saat menggunakannyasudo -i
tidak ada di sana. Tentu saja sekarang saya tahu saya bisa menambahkannya ke / etc / sudoers, tetapi itu masih tidak menjelaskan mengapa itu sudah ada setelahnyasu -
. Dari mana asal bagian PATH ini?Setelah banyak memahami dan mencari, saya menemukan jawabannya:
Path default yang mengandung '/ usr / local / bin' sebenarnya hardcoded di su (1).
Jadi tidak ada konfigurasi pam, profil, bashrc atau apa pun yang bertanggung jawab untuk menambahkan elemen ini secara selektif. Itu selalu ada di sana ketika
su
mengambil alih. Dan karenasudo
tidak memintasu
sama sekali tetapi menggunakan konfigurasi sendiri, itu hilang setelahsudo -i
Saya menemukan ini benar di RHEL6 dan RHEL7. Saya tidak memeriksa versi atau distribusi lainnya.
sumber
su
biner, berubah/usr/local/bin
menjadi sesuatu yang lain dan meminta salinannya. PATH saya sekarang berisi string yang dimodifikasi ... Anak-anak yang baik dan sysadmin yang tidak malas tentu saja mengunduh sumbernya dan memeriksa di sana. ;-)