Variabel lingkungan saat dijalankan dengan 'sudo'

48

Sebagai contoh untuk pertanyaan saya, ~/.bashrcfile saya berisi baris ini:

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

sehingga Numpy (Python) dapat menemukan perpustakaan yang perlu dijalankan, karena dibangun dengan kompiler MKL dan Intel. Alur kerja ini bukan yang terbaik, tapi itu cerita lain.

Pertanyaan saya adalah bagaimana saya bisa meneruskan variabel arbitrer (seperti yang ada di ~/.bashrc) ketika saya menjalankan program dengan 'sudo' (tetapi tidak root)?

Saat ini, jika saya menjalankan:

sudo python -c "import numpy"

Saya mendapatkan kesalahan:

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

Beberapa saran sebagai sudo -iatau sudo -Etidak mengubah apa pun di sini.


Sunting:

Saya tidak bisa menjawab pertanyaan saya (tidak cukup poin: D) tapi saya akan berkomentar di sini, dengan harapan ada pemula Linux lain yang bertanya-tanya tentang sudojebakan.

[Hanya sementara!] Ini bekerja untuk saya ( ~/.bashrc):

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

Jawaban:

57

Variabel lingkungan dapat dengan mudah diteruskan setelah sudodalam bentuk ENV = VALUE dan thay akan diterima oleh perintah yang diikuti. Tidak diketahui oleh saya jika ada batasan untuk penggunaan ini, jadi masalah contoh saya dapat diselesaikan dengan:

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"
zetah
sumber
Masih hari ini ini bekerja untuk saya, pada Raspbian saya Jessy untuk RPi 3 saya ... setelah hampir seminggu mematahkan kepala saya mengapa skrip saya tidak berjalan saat startup. Terima kasih banyak!
DarkCygnus
21

The -Epilihan Anda menyebutkan tampaknya bekerja dengan baik:

enzotib@host:~$ export DUMMY=dummy
enzotib@host:~$ sudo -E sh -c 'echo $DUMMY'
dummy
enzotib@host:~$ sudo -E env | grep DUMMY
DUMMY=dummy
enzotib
sumber
Maaf, tapi saya tidak mengerti jawaban Anda. Bisakah Anda memberikan contoh skenario yang saya posting di atas? yaitu untuk dapat dijalankan sudo python -c "import numpy"dengan LD_LIBRARY_PATHdan LD_PRELOADdidefinisikan seperti yang tertulis di atas?
zetah
2
@zetah: ok, aku salah, karena ia bekerja untuk variabel generik, tetapi tidak untuk dymanic menghubungkan mengendalikan variabel, seperti yang dinyatakan dalam bagian SECURITY NOTESdari sudohalaman manual.
enzotib
Lebih sederhana daripada itu (seperti dalam jawaban yang diberikan), meskipun man sudotidak membuatnya jelas, dan ketika pengguna mencoba untuk mengikuti referensi yang ditunjukkan di sana, sangat mudah untuk berkecil hati oleh semua cabang yang perlu diikuti, untuk dapat mendekripsi seharusnya berarti.
zetah
14

Anda dapat menggunakan -Eopsi sudo untuk menjaga lingkungan saat ini (jika Anda memiliki hak untuk melakukannya)

$ 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.
Eugen Konkov
sumber
8

Anda perlu mengedit Anda sudoersdengan sudo visudosebagai kemungkinan Anda sudah Plugin kebijakan keamanan diaktifkan yang menimpa Anda PATHdengan secure_pathpilihan. Jadi tambahkan path ke daftar dan Anda juga bisa menggunakan env_keep, sebagai contoh:

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"

Untuk memeriksa apakah Anda PATHdiganti, jalankan perintah berikut:

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

Lihat juga: Mengapa variabel PATH berbeda ketika berjalan melalui sudo dan su? di Unix SE

kenorb
sumber
+1, tetapi env_keeptidak berfungsi pada PATH (dalam arti yang sudomasih digunakan secure_pathsaat mencari perintah)
Zanna
0

Ini berfungsi untuk saya ( ~/.bashrc):

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

Sumber: Sesuai OP edit

kenorb
sumber
1
ini bekerja, tetapi itu adalah ide yang buruk karena itu membuat berjalan sudokurang aman
Zanna