'सुडो' के साथ चलने पर पर्यावरण चर


48

मेरे प्रश्न के उदाहरण के रूप में, मेरी ~/.bashrcफ़ाइल में यह पंक्तियाँ हैं:

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

ताकि Numpy (Python) को लाइब्रेरीज़ मिल सकें जिन्हें चलाने की ज़रूरत है, क्योंकि यह MKL और Intel कंपाइलर्स के साथ निर्मित है। यह वर्कफ़्लो सबसे अच्छा नहीं है, लेकिन यह एक और कहानी है।

मेरा सवाल यह है कि ~/.bashrcजब मैं 'सुडो' (लेकिन रूट नहीं) के साथ कार्यक्रम चलाऊं तो मैं मनमाने ढंग से चर (जैसे उनमें ) कैसे पारित कर सकता हूं ?

वर्तमान में, अगर मैं चला:

sudo python -c "import numpy"

मुझे एक त्रुटि मिली:

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

यहाँ कुछ सुझाव sudo -iया sudo -Eकुछ भी नहीं बदलता है।


संपादित करें:

मैं अपने प्रश्न का उत्तर नहीं दे सकता (पर्याप्त अंक नहीं: D), लेकिन मैं यहां एक टिप्पणी करूंगा, इस उम्मीद में कि अन्य लिनक्स के नए शौक हैं जो sudoजाल के बारे में सोच रहे हैं ।

[केवल अस्थायी रूप से!] यह मेरे लिए काम करता है ( ~/.bashrc):

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

जवाबों:


57

पर्यावरण चर को केवल sudoENV = VALUE के बाद पास किया जा सकता है और उसके बाद कमांड द्वारा स्वीकार किया जाएगा। यह मेरे लिए ज्ञात नहीं है अगर इस उपयोग के लिए प्रतिबंध हैं, तो मेरे उदाहरण की समस्या को हल किया जा सकता है:

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"


फिर भी आज यह मेरे लिए काम कर रहा है, मेरी आरसी 3 के लिए मेरे रास्पियन जेसी पर ... लगभग एक हफ्ते के बाद मेरा सिर टूट गया, मेरी स्क्रिप्ट स्टार्टअप पर क्यों नहीं चली। आपका बहुत बहुत धन्यवाद!
डार्ककाइग्नस

21

आपके द्वारा बताया गया -Eविकल्प ठीक काम करता है:

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

क्षमा करें, लेकिन मुझे आपका उत्तर समझ में नहीं आया। क्या आप ऊपर पोस्ट किए गए परिदृश्य पर उदाहरण प्रदान कर सकते हैं? यानी चलाने के लिए सक्षम होने के लिए sudo python -c "import numpy"के साथ LD_LIBRARY_PATHऔर LD_PRELOADजैसा कि ऊपर लिखा परिभाषित?
zetah

2
@zetah: ठीक है, मैं, गलत हूँ, क्योंकि यह सामान्य चर के लिए काम करता है, लेकिन dymanic जोड़ने को नियंत्रित चर के लिए नहीं, के रूप में खंड में कहा गया है SECURITY NOTESकी sudoमैन्युअल पृष्ठ।
enzotib

यह तब सरल है (जैसा कि प्रदान किए गए उत्तर में), हालांकि man sudoयह स्पष्ट नहीं करता है, और जब उपयोगकर्ता वहां बताए गए संदर्भों का पालन करने की कोशिश करता है, तो सभी शाखाओं द्वारा पालन किए जाने के लिए हतोत्साहित होना बहुत आसान है, जिसे डिक्रिप्ट करने में सक्षम होना चाहिए जिसका अर्थ है।
zetah

14

आप -Eवर्तमान परिवेश को संरक्षित करने के लिए sudo विकल्प का उपयोग कर सकते हैं (यदि आपके पास ऐसा करने के अधिकार हैं)

$ 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

आपको अपने sudoersद्वारा संपादित करने की आवश्यकता है sudo visudoसंभवतः आपने सुरक्षा नीति प्लगइन को सक्षम किया है जो आपके विकल्प से आगे निकल PATHजाता secure_pathहै। इसलिए सूची में पथ जोड़ें और आप env_keepइसके बजाय उपयोग कर सकते हैं , उदाहरण के लिए:

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"

यह जाँचने के लिए कि आपका PATHओवरराइड हुआ है, निम्नलिखित कमांड चलाएँ:

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

यह भी देखें: सुडो और सु के माध्यम से चलने पर पैथ चर अलग क्यों हैं? यूनिक्स एसई पर


+1, लेकिन env_keepPATH पर काम नहीं करता है (इस अर्थ में जो sudoअभी भी secure_pathकमांड की तलाश में उपयोग करता है )
Zanna

0

यह मेरे लिए काम करता है ( ~/.bashrc):

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

स्रोत: ओपी एडिट के अनुसार


1
यह काम करता है, लेकिन यह एक बुरा विचार है क्योंकि यह sudoकम सुरक्षित बनाता है
Zanna
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.