Sudo ve su üzerinden çalışırken PATH değişkenleri neden farklı?


39

Fedora VM'mde, kullanıcı hesabımla çalışırken /usr/local/binyolumda var:

[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

Ve aynı zamanda çalıştırırken 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

Ancak, üzerinden çalışırken sudo, bu dizin yolda değil:

[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

Yol üzerinden çalışırken neden farklı olabilir sudo?



Yanıtlar:


37

Bir göz atın /etc/sudoers. Fedora'daki (RHEL ve ayrıca Ubuntu ve benzeri) varsayılan dosya bu satırı içerir:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

Bu, sudo altında ikili dosyaları çalıştırırken yolunuzun temiz olmasını sağlar. Bu , bu soruda belirtilen kaygıların bir kısmına karşı korunmaya yardımcı olur . Eğer yoksa Ayrıca uygundur /sbinve /usr/sbinkendi yolunda.


Ah, bunu dosyamda görüyorum. Yani, istemiyor, ama ben eklenirse /usr/local/binbu direktife sonra ben ederim yoluyla çalıştırırken benim yolu olarak görmek sudodoğru?
Justin Ethier

Sadece denedim ve şimdi görüyorum /usr/local/bin. Bunu açıkladığınız için çok teşekkür ederiz!
Justin Ethier

Kullanıcılarınızın komut dosyaları ve ikili dosyalar için yolunu eklemeye ne dersiniz, bu nedenle mutlak yolu yazmanız gerektiğinde sudoörneğin bir komut dosyası ~/bin(veya ne kullanıyorsanız kullanın) yazmak zorunda değilsiniz ? Ben sadece değişikliği yaptım - işe yarıyor, sadece bunun bir yanının olabileceğini düşündüm?
Emanuel Berg

@ mattdm Evet, Ubuntu da, VM ile oynarken Ubuntu Vivid'te bu konuya rastladığım gibi. Debian için aynı .
kenorb

9

Komut su -, kök kullanıcı profilini yürütecek ve yol vb. Dahil olmak üzere bu kullanıcının ortamını üstlenecektir sudo.

Onun gibi sudodavranmak istiyorsanız , kullanıcının profilini su -uygulayacak seçeneği kullanınsudo -i [command

Gibi su -davranmak istiyorsanız sudo, kısa çizgi kullanmayın - sadece kullanınsu [command]


2

Nedenini (farklı) çalıştırarak kontrol edebilirsiniz sudo sudo -V.

Örneğin Linux çalıştırmasında:

$ sudo sudo -V | grep PATH
Value to override user's $PATH with: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Not: Açık MacOS / BSD, sadece çalıştırın: sudo sudo -V.

Bazı Linux dağıtımlarında varsayılan güvenlik politikası eklentisi nedeniyle yukarıdaki liste kısıtlanmıştır.


Bu daha ayrıntılı olarak açıklanmıştır man sudoers:

Eğer secure_pathseçenek ayarlanırsa, değeri için kullanılacak PATHortam değişkeni.

secure_path- Her komut için sudo'dan çalıştırılan yol. Sudo çalıştıran insanlara aklı başında bir PATHortam değişkenine sahip olmalarına güvenmiyorsanız, bunu kullanmak isteyebilirsiniz.

Başka bir kullanım, “kök yolun” “kullanıcı yolundan” ayrı olmasını istiyorsanız. exempt_groupSeçenek tarafından belirtilen gruptaki kullanıcılar bundan etkilenmez secure_path. Bu seçenek varsayılan olarak ayarlanmamış.

Bu durumda, sudo visudoyapılandırma dosyasını çalıştırarak ve düzenleyerek ve değiştirerek secure_path(ayrı yol ekleyerek :) veya kullanıcıyı içine ekleyerek exempt_group( secure_pathseçeneklerden etkilenmeyeceksiniz ) değiştirebilirsiniz.

Veya kullanıcının PATHgeçici mesajını geçmek için koşabilirsiniz:

sudo env PATH="$PATH" my_command

ve şunu kontrol edebilirsiniz:

sudo env PATH="$PATH" env | grep ^PATH

Ayrıca bkz: Nasıl yapmak sudokorumak $PATH?


Ortamın farklı olmasının diğer bir nedeni de, dosyanızda etkin seçeneği etkinleştirilmiş sudoolmanız olabilir . Bu, komutların yeni, minimal bir ortamla yürütülmesine neden olur.env_resetsudoers

Bu nedenle , kullanıcı ortam değişkenlerinizi korumak için env_keepseçeneği ( güvenlik nedeniyle önerilmez ) kullanabilirsiniz:

Defaults        env_reset
Defaults        env_keep += "PATH PYTHONPATH"

1

Çoğu linux'ta, programları paket yönetimi aracılığıyla yükler ve düzenli olarak güncellemeler alırsınız. Paket yönetimini çevreleyen bir şey kurarsanız, / usr / local / bin dizinine (örneğin veya ... / sbin veya / opt) yüklenir ve düzenli güncellemeler alınmaz.

Bu nedenle, programların bu kadar güvenli olduğu düşünülmüyor ve varsayılan olarak PATH köklerine yerleştirilmiyor.


+1 - Harika, neden yolunda olmadığını merak ediyordum ve bu mantıklı geliyor. Buna değer olarak, node.js'i sıfırdan inşa edip onunla oynamak üzereydim, bu yüzden niçin oraya yerleştirildiğini ve neden sudobu dizini varsayılan olarak dışlayacağını anlam ifade ediyor .
Justin Ethier,

@Justin Ethier: konu dışı, ancak bugzilla.redhat.com/show_bug.cgi?id=634911
mattdm

1

Bunu sadece kendim için denedim ve görmekte olduğunuz davranışı görmedim - yolum aynı kaldı, bu yüzden belki de sudo yapılandırmanız farklı. Kontrol man sudoersederseniz, secure_pathsıfırlanan denilen bir seçenek olduğunu göreceksiniz PATH- bu seçenek etkin olmuş gibi görünmektedir.


İlginç. Bu, Fedora 12’de, buna değerdi ...
Justin Ethier,

1

Çünkü kullandığınızda sudo bash, bashgiriş kabuğu gibi davranmaz. İle tekrar deneyin sudo bash -lve aynı sonucu görmelisiniz su -.

Bu doğru ise, o zaman farkı PATHyapılandırma dosyalarında yalanlar: /etc/profile, ~/.bash_profile, ~/.bash_login, ~/.profileiken, bir giriş kabuğu için (bu sırayla) yürütülür ~/.bashrcolmayan bir giriş etkileşimli kabuk için yürütülür.


0

Eski soru, biliyorum, ama şimdi tam buraya girdim çünkü tam olarak bu sorunu araştırıyordum.

Bazı nedenlerden /usr/local/bindolayı sadece kök yoluyla olurken PATH'taydı sudo su -. Kullanırken sudo -iorada değildi. Tabii ki şimdi / etc / sudoers 'a ekleyebileceğimi biliyorum ama bu hala neden orada olduğunu açıklayamadı su -. PATH'ın bu kısmı nereden geldi?

Çok fazla grepping ve araştırdıktan sonra cevabı buldum:

'/ Usr / local / bin' içeren varsayılan yol aslında su (1) 'de kodlanmış.

Bu nedenle, seçmeli olarak bu öğenin seçilmesinden pam yapılandırması, profil, bashrc veya hiçbir şey sorumlu değildi. Devralındığında her zaman zaten oradaydı su. Ve sudohiç çağırmaz su, ancak kendi yapılandırmasını kullanır, çünkü sonrasudo -i

Bunun RHEL6 ve RHEL7'de doğru olduğunu buldum. Başka bir sürümü veya dağıtımı kontrol etmedim.


Bana bunu nasıl doğruladığımı sorma. Tamam, ısrar edersen: İkilinin bir kopyasını onaltılık düzenledim su, /usr/local/binbaşka bir şeyle değiştirdim ve kopyayı çağırdım. PATH şimdi değiştirilmiş string içeriyordu ... İyi çocuklar ve tembel olmayan sysadmins tabii ki sadece kaynak indirmek ve orada kontrol edin. ;-)
Oscar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.