मैं अपने पर्यावरण चर को कैसे सुरक्षित कर सकता हूं?


47

Solaris 5.10 पर sudo 1.7.4p4 और RHEL4 u6 पर sudo 1.6.7p5 का उपयोग करके मैं अपने पर्यावरण चर को संरक्षित करने का तरीका नहीं देख सकता, उदाहरण के लिए $ PYTHONPATH। मैंने इस लाइन को sudoers में जोड़ा है, लेकिन इससे कोई फर्क नहीं पड़ता:

Defaults !env_reset

क्या मैं कुछ गलत कर रहा हूँ, या sudo अधिष्ठापन केवल env_reset ध्वज का सम्मान नहीं कर रहा है?

संपादित करें: कम से कम सोलारिस पर, हमने पाया है कि यह मुद्दा शेल पर निर्भर करता है! मानक रूट शेल बोर्न है, अगर हम sudo bashदूसरी तरफ सुडो ( ) के तहत बैश चलाते हैं; तो env_preset पर्यावरण को संरक्षित करेगा (PATH और LD_LIBRARY_PATH सहित)। यह बल्कि भ्रामक व्यवहार है जो मुझे कहना है।


जवाबों:


44

सावधानी से उपयोग करें, सूडो और चर के साथ सुरक्षा मुद्दे हैं।

से man sudoersमैंने पाया कि आप का उपयोग करना चाहिए

चूक env_reset
डिफ़ाल्ट्स env_keep + = "PYTHONPATH OTHERVARIABLE YETANOTHER"

उबंटू में, sudoकुछ चर को संरक्षित करता है। sudo -iरूट के रूप में लॉग इन करना और फिर कमांड चलाना अधिक पसंद है। दोनों असुविधाजनक हो सकते हैं, sudo nano myfileआपके घर के अंदर रूट-स्वामित्व वाली फ़ाइलों के लिए पूर्व और बाद के लिए sudo -i nano myfile/ रूट / मायफाइल खोलने की कोशिश करेंगे।


रन

sudo printenv PATH

और देखते हैं कि यह क्या देता है। यहाँ यह देता है

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

उदाहरण के लिए। अब दौड़ें sudo visudoऔर लाइन जोड़ें

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

जो आपने पहले पाया, उसकी जगह। जरूरत पड़ने पर उस पर एक नया रास्ता जोड़ो।

पुस्तकालयों के बारे में:

sudo LD_LIBRARY_PATH=/usr/lib/path/to/a/safe/library your command

लिनक्स वितरण के साथ बहुत देखभाल करते हैं PATH, और इसके साथ खेलने से पहले आपको वास्तव में सावधान रहना चाहिए। " ." या जैसे पथ जोड़ने के बारे में विशेष रूप से सावधान रहें /home/username, यह असुरक्षित है।

रास्तों को जोड़ने के खतरों में से एक यह है कि यह इन पथों पर फ़ाइलों की संभावना के लिए खुलता है root, सिस्टम सुरक्षा में एक विंडो खोलना, जो दुर्भावनापूर्ण सॉफ़्टवेयर द्वारा शोषण किया जा सकता है। अन्य खतरे भी हो सकते हैं। बस सुनिश्चित करें कि आप जानते हैं कि आप क्या कर रहे हैं। sudoसुरक्षा उपायों को दरकिनार करके आपके सोलारिस को विंडोज एक्सपी के रूप में सुरक्षित किया जा सकता है।


सलाह के लिये धन्यवाद। कम से कम सोलारिस पर, ऐसा प्रतीत होता है कि env_keep केवल भाग में काम करता है, क्योंकि यह PATH और LD_LIBRARY_PATH की उपेक्षा करता है। शायद sudo सेटिंग्स के साथ बनाया गया है जो इसे "खतरनाक" चर को संरक्षित करने से मना करता है?
एकन्यूड्स १

क्या यह AKNUDS की तरह एक और वायब्रल के साथ काम करता था? आप sudo sudo -V (हाँ, दो बार sudo!) भी चला सकते हैं और देखें कि यह क्या कहता है। यहाँ उपरोक्त समाधान PYTHONPATH के साथ ठीक काम करता है, लेकिन PATH वास्तव में विशेष लगता है। असली समस्या PATH के साथ है। उबंटू में वे सुडो को जानबूझकर PATH को रीसेट करने का निर्माण करते हैं।
user39559

env_keep ने मेरे लिए PYTHONPATH और HOME को संरक्षित किया है, इसलिए स्पष्ट रूप से कुछ फ़िल्टरिंग चल रही है।
एकन्यूड्स १

अपने संशोधित समाधान में, आप सुझाव दे रहे हैं कि मैं sud_ATH को सिक्योर_पथ को संशोधित करके हार्ड-वायर कर रहा हूं, है ना? मुझे नहीं लगता कि मैं ऐसा करना चाहता हूं। हम शायद मेरे सवाल के जवाब के करीब हैं; मुझे लगता है कि sudo को reset_env को अनदेखा करने और PATH और LD_LIBRARY_PATH जैसे वेरिएबल्स को अनदेखा करने के लिए बनाया गया है, जब env_keep के साथ निर्दिष्ट किया गया है। मुझे लगता है कि मैं sudo के तहत PATH / LD_LIBRARY_PATH को संरक्षित किए बिना कर सकता हूं, यह कोई बड़ी बात नहीं है, लेकिन यह जानना दिलचस्प है कि यह काम क्यों नहीं करेगा :)
aknuds1

यह काम नहीं करेगा क्योंकि sudoलेखक आपको इसे करने से रोकने में सावधान थे। आप दुर्भावनापूर्ण पुस्तकालय लोड नहीं करना चाहते हैं क्योंकि वे sudo द्वारा उपयोग किए गए पथ में पाए गए थे। तो, इसीलिए इसे रीसेट किया गया है। यदि आप सामान को कोड कर रहे हैं जो रूट द्वारा चलाया जाना है, तो उन्हें उपयुक्त सिस्टम डायरेक्टरी में कॉपी करें।
यूजर 39559

8

साथ नगण्य sudoers, सावधानी के साथ किया जाना के रूप में अन्य लोगों ने कहा है।

सरल मामलों के लिए एक सरल दृष्टिकोण जब विशेष पर्यावरण चर होते हैं जिन्हें आप संरक्षित करना चाहते हैं, तो बस उस पर्यावरण चर को पारित करना है जिसे आप सीधे सूडो के माध्यम से चाहते हैं (यह [VAR=value]सूडो cmdline मदद के रूप में दिखाया गया है )।

इस छोटे से उदाहरण को देखें जहां मैंने एक से अधिक वेरिएबल के लिए भी इसका प्रदर्शन किया है।

$ export MY_V1=1
$ export MY_V2=2
$ printenv | grep MY_V
MY_V2=2
MY_V1=1
$ sudo MY_V1=$MY_V1 MY_V2=$MY_V2 printenv | grep MY_V
MY_V2=2
MY_V1=1

PYTHONPATHप्रश्न में मूल उदाहरण के लिए, बस निम्नलिखित का उपयोग करें:

$ sudo PYTHONPATH=$PYTHONPATH python some_script.py
<script_output_here>

इस प्रकार की चीज़ के लिए एक उपनाम बनाना आसान है। इस तरह:

$ alias sudopy='sudo PYTHONPATH=$PYTHONPATH python'

1
यह बनाने के लिए अच्छा हो सकता है कि - उर्फ ​​सुडोकू = 'sudo PYTHONPATH = $ PYTHONPATH python' - तो इसे sudopy some_script.py
Able Mac

@AbleMac आप सही हैं। यह एक गलती थी ... मैं इसे ठीक कर दूंगा। धन्यवाद!
रस

3

आपका Defaults !env_resetठीक लग रहा है, यह मानते हुए कि आप -Eविकल्प के साथ सुडोल भी नहीं कह रहे हैं ।

आप पूरी तरह से उस प्रविष्टि को हटाने का प्रयास कर सकते हैं।

क्या आपने सत्यापित किया है कि आप सही sudoers फ़ाइल का संपादन कर रहे हैं? मैं यह अनुमान लगा रहा हूं कि यह कैसे स्थापित हो सकता है /etc/sudoersया /usr/local/etc/sudoersइस पर निर्भर करता है। क्या आपने इसे उपयोग करके संपादित किया visudo?

आप सूडो कैसे चला रहे हैं? sudo python, sudo su, sudo su -, sudo -s, कुछ और? केवल sudo pythonऔर sudo suअपने पर्यावरण को संरक्षित करेगा।

क्या env | grep PYTHONPATHकहता है? यदि कुछ नहीं है, तो सुनिश्चित करें कि PYTHONPATH रन करके निर्यात किया गया है export PYTHONPATHऔर फिर से प्रयास करें।

क्या sudo env | grep PYTHONPATHकहता है? यदि यह अपेक्षित मूल्य को प्रिंट करता है, तो कुछ और आपके PYTHONPATH मूल्य को अधिलेखित कर रहा है। हो सकता है कि रूट की .bashrc या .bash_profile या सिस्टम-वाइड कॉन्फ़िगरेशन फ़ाइलें हों।


1
मुझे पूरा यकीन है कि मैं सही sudoers का संपादन कर रहा हूँ, sudo के लिए अधिष्ठापन उपसर्ग के साथ। मैं sudo को "sudo su" के रूप में चला रहा हूं। मुझे आपके पास वापस जाना होगा, कुछ दिनों में दुर्भाग्य से, आपके बाकी सुझावों पर ध्यान दें। धन्यवाद!
एकन्यूड्स १

1
की तरह एक महत्वहीन सेटिंग को बदलने का प्रयास करें editorया passpromptअगर आप सही फ़ाइल है देखने के लिए। या स्ट्रेस, डीट्रेस, ट्रस या इसी तरह का उपयोग करें और देखें कि यह किस फाइल को खोलता है।
मिकेल

env | grep PYTHONPATH के रूप में मेरे उपयोगकर्ता अपेक्षित मूल्य प्रिंट करता है, हालांकि sudo के तहत, कुछ भी नहीं मुद्रित होता है। Sudoers का संपादन, मैं यह सुनिश्चित कर सकता हूं कि PYTHONPATH "env_keep" को संशोधित करके संरक्षित है। हालाँकि, env_keep PATH या LD_LIBRARY_PATH को संरक्षित नहीं करेगा। मुझे लगता है कि sudo के पास PATH और LD_LIBRARY_PATH जैसे चरों को संरक्षित नहीं करने के लिए सुरक्षा प्रतिबंध है? एक निर्माण समय सेटिंग शायद?
एकन्यूड्स १

1
! env_reset को अब तक नजरअंदाज किया जा रहा है, जहां तक ​​मैं बता सकता हूं, लेकिन मैं कल जांच कर सकता हूं। मुझे पूरा यकीन है कि env_delete सेट नहीं हो रहा है, लेकिन मैं यह भी देख सकता हूं।
एकनाउड्स 1

1
मैंने पुष्टि की है कि! Env_reset को अनदेखा किया गया है और env_delete सेट नहीं किया गया है।
एकन्यूड्स १

-1

LD_LIBRARY_PATH के लिए Ubuntu दस्तावेज़ के अनुसार :

आपको /etc/ld.so.conf.d/*.conf कॉन्फ़िगरेशन फ़ाइलों का उपयोग करना चाहिए

फिर:

  1. अपने पथ के साथ एक ld.soकॉन्फ़िगरेशन फ़ाइल जोड़ें/etc/ld.so.conf.d/LD_LIBRARY_PATH

  2. कैश को इसके साथ अपडेट करें:

    sudo ldconfig -v
    

अच्छा लगा, लेकिन सवाल उबंटू के बारे में नहीं है। संकेत: अगली बार प्रश्न के तहत टैग देखें।
DavidPostill
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.