'Sudo' ile çalıştırıldığında ortam değişkenleri


48

Soruma örnek olarak, ~/.bashrcdosyam şu satırları içeriyor:

export LD_LIBRARY_PATH=/opt/intel/mkl/lib/ia32:$LD_LIBRARY_PATH
export LD_PRELOAD=/opt/intel/mkl/lib/ia32/libmkl_core.so

Böylece Numpy (Python), MKL ve Intel derleyicilerle oluşturduğu için çalışması gereken kütüphaneleri bulabilir. Bu iş akışı en iyi değil, ama bu başka bir hikaye.

Sorum şu: 'sudo' (ancak root değil) ile program çalıştırdığımda keyfi değişkenleri (içinde olduğu gibi ~/.bashrc) nasıl iletebilirim ?

Şu anda, eğer kaçarsam:

sudo python -c "import numpy"

Bir hata alıyorum:

ImportError: libimf.so: cannot open shared object file: No such file or directory*

Burada bazı öneriler sudo -iveya sudo -Ehiçbir şey değişmiyor.


Düzenle:

Soruma cevap veremiyorum (yeterli puan yok: D) ancak burada yorumlayacağım, umarım sudotuzaklar hakkında merak eden başka Linux yenileri vardır .

[Sadece geçici olarak!] Bu benim için çalışıyor ( ~/.bashrc):

alias sudo='sudo env PATH=$PATH VAR1=SOME_VALUE VAR2=SOME_VALUE...'

Yanıtlar:


57

Ortam değişkenleri sudoENV = VALUE formundan sonra kolayca iletilebilir ve ardından komut ile kabul edilir. Bu kullanımla ilgili kısıtlamalar olup olmadığı benim için bilinmiyor, bu nedenle örnek problemim çözülebilir:

sudo LD_LIBRARY_PATH=/opt/intel/mkl/lib/ia32:$LD_LIBRARY_PATH LD_PRELOAD=/opt/intel/mkl/lib/ia32/libmkl_core.so python -c "import numpy"


Bugün bu benim için çalıştı, Raspbian Jessy'imde RPI 3'üm için ... neredeyse bir hafta sonra kafamı kırdıktan sonra senaryom neden başlangıçta koştu. Çok teşekkürler!
DarkCygnus

21

Bahsettiğiniz -Eseçenek sadece iyi çalışıyor gibi görünüyor:

enzotib@host:~$ export DUMMY=dummy
enzotib@host:~$ sudo -E sh -c 'echo $DUMMY'
dummy
enzotib@host:~$ sudo -E env | grep DUMMY
DUMMY=dummy

Üzgünüm, ama cevabınızı anlamıyorum. Yukarıda yayınladığım senaryoya örnek verebilir misiniz? yani çalıştırmak için muktedir sudo python -c "import numpy"olan LD_LIBRARY_PATHve LD_PRELOADyukarıda yazılı olarak tanımlanan?
zetah,

2
@zetah: bölümünde belirtildiği gibi, genel değişken için çalışır, ancak dymanic bağlama kontrol eden değişkenler için çünkü Tamam, ben yanılıyorum, SECURITY NOTESbir sudokılavuz sayfası.
enzotib

O zaman daha basittir (verilen cevapta olduğu gibi), man sudoaçıkça belirtmese de, ve kullanıcı burada belirtilen referansları takip etmeye çalıştığında, takip edilmesi gereken tüm dallar tarafından cesaretini kırmak, sözde şifresini çözmek için çok kolaydır. anlamına gelir.
zetah,

14

-EMevcut ortamı korumak için sudo seçeneğini kullanabilirsiniz (bunu yapma hakkınız varsa).

$ man sudo
 -E, --preserve-env
             Indicates to the security policy that the user wishes to preserve
             their existing environment variables.  The security policy may
             return an error if the user does not have permission to preserve
             the environment.

8

Eğer düzenlemeniz gereken sudoerstarafından sudo visudoolarak muhtemelen sizin geçersiz kılar etkinleştirilmiş güvenlik ilkesi eklentisi ettik PATHtarafından secure_pathseçeneği. Böylece listeye yolu ekleyin; env_keepbunun yerine, örneğin:

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"

Senin olmadığını kontrol etmek için PATHgeçersiz kılınır, aşağıdaki komutu çalıştırın:

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

Ayrıca bakınız: sudo ve su üzerinden çalışırken PATH değişkenleri neden farklı? Unix SE şirketinde


+1, ancak env_keepPATH üzerinde çalışmaz ( sudohala secure_pathemri ararken hala kullanılan anlamında )
Zanna

0

Bu benim için çalışıyor ( ~/.bashrc):

alias sudo='sudo env PATH=$PATH VAR1=SOME_VALUE VAR2=SOME_VALUE...'

Kaynak: OP düzenlemesine göre


1
Bu işe yarar, ama bu kötü bir fikir çünkü sudodaha az güvenli çalışmasını sağlıyor
Zanna
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.