OS X Mavericks पर सिस्टम-वाइड वातावरण चर कैसे सेट करें


36

हम /etc/environmentमाउंटेन लायन पर सिस्टम-वाइड वातावरण चर सेट करने के लिए उपयोग करते थे। हालाँकि, ऐसा लगता है कि यह फ़ाइल अब पढ़ी नहीं गई है।

आदर्श रूप से समाधान सभी उपयोगकर्ताओं के लिए लागू होना चाहिए, और हमें ssh कंसोल सत्र के साथ काम करने की आवश्यकता है। इसलिए हमें काम करने के लिए इसकी आवश्यकता है

ssh user@mavericks-machine 'echo $MY_ENV_VAR'

अब तक हमने कोशिश की है:

  • /etc/launchd.conf

    सभी उपयोगकर्ताओं के लिए काम करता है, लेकिन केवल 'विंडो' वाले अनुप्रयोगों पर लागू होता है, अर्थात टर्मिनल में काम करता है, लेकिन एक सत्र में नहीं।

  • ~/.profile, ~/.bash_profileआदि।

    केवल गोले पर लागू होता है

कोई सुझाव?


फ़ाइल ( /etc/environment) नहीं पढ़ी गई है क्योंकि यह कोई क्रॉस-सिस्टम मानक नहीं है - यह लिनक्स पीएएम सुविधा का सिर्फ एक हिस्सा है। मैक ओएस एक्स लिनक्स नहीं है और पीएएम का उपयोग नहीं करता है, न ही मेरे ज्ञान के लिए अन्य ऑपरेटिंग सिस्टम। आप केवल इसके साथ दूर हो गए क्योंकि आप लिनक्स पर थे, जाहिरा तौर पर। और हाँ, यह अभी भी पढ़ा जाता है - लिनक्स द्वारा ;-)
amn

जवाबों:


18

Mavericks से पहले सही फ़ाइल थी ~/.MacOSX/environment.plist। यह अब समर्थित नहीं है।

डार्विन में, और इसलिए मैक ओएस एक्स में, इन्हें सेट करने के लिए उचित स्थान /etc/launchd.confसभी प्रक्रियाओं पर लागू होता है; यदि विशेष रूप से उपयोगकर्ता के गोले से संबंधित है, तो प्रश्न में शेल के आधार पर, इसके बजाय उपयुक्त शेल फ़ाइलों का उपयोग करें। अधिक के लिए launchd.confऔर launchctlमैन पेज देखें ।

ने कहा कि...

यदि आप लक्ष्य विशेष रूप से ssh सत्रों के लिए इन पर लागू होते हैं, तो आपको यह जानना होगा कि ssh, सुरक्षा कारणों से, इस तरह से पर्यावरण चर लागू नहीं करता है। वास्तव में एक ssh सत्र आमतौर पर OS से पर्यावरण चर का एक बहुत अधिक प्रतिबंधक सेट प्राप्त करता है क्योंकि यह ऐसा नहीं है जिसे "लॉगिन" या "इंटरैक्टिव" शेल के रूप में जाना जाता है, इसे "गैर-इंटरैक्टिव" शेल के रूप में वर्गीकृत किया गया है। ( man bashशेल प्रकारों पर अधिक जानकारी के लिए देखें ।) जिस तरह से ssh पर्यावरण चर को संभालता है, वह ssh / sshd डॉक्स और मैन पेज में अच्छी तरह से कवर होता है।

Ssh के लिए - जो कि यह स्वयं का शेल है, बैश करने के लिए समान है - सत्र के लिए पर्यावरण वैरिएबल ~/.ssh/environmentको प्रति-उपयोगकर्ता के रूप में संग्रहीत किया जाता है, जो इन्हें संबंधित लॉन्च फ़ाइलों में bash या csh, आदि के लिए सेट करने के बराबर है। यह वह जगह है जहाँ आप अपने उपयोगकर्ता ssh सत्रों के लिए अपना ENV चर निर्धारित करना चाहते हैं, हालाँकि आप इस बात का विवरण नहीं देते हैं कि आप अपने मूल पद पर विश्व स्तर पर ENV को असाइन करना क्यों चाहते हैं, जो एक समाधान प्रदान करने में सहायक होता। मेरा सुझाव है कि आप उन्हें प्रत्येक उपयोगकर्ता के आधार पर स्पष्ट रूप से कम से कम प्रतिबंधात्मक विशेषाधिकार / विशेषता अभ्यास अभ्यास के बाद प्रत्येक संबंधित खाते के आधार पर उचित सुरक्षा बनाए रखने के लिए निर्धारित करें।

यदि किसी कारण से आप इस के सुरक्षा निहितार्थों को अनदेखा करना चाहते हैं, तो PermitUserEnvironmentअपने ssh config में सेट करें। ध्यान दें कि UseLoginसक्षम होने पर यह अक्षम है। महत्वपूर्ण: यह समझें कि इसका अर्थ है कि उपयोगकर्ता खाते /bin/falseअपने शेल के रूप में उपयोग करने के लिए सेट हैं - उपयोगकर्ता खाते को अक्षम करने के लिए विशिष्ट विधि - अब संभवतः इस प्रतिबंध के आसपास हो सकती है और अब सक्रिय हो सकती है, जो खतरनाक है। कई खातों को /bin/falseसुरक्षा की उम्मीद के रूप में उनके शेल के रूप में उपयोग करने के लिए निर्धारित किया जाता है।

लब्बोलुआब यह है कि आप विश्व स्तर पर ऐसा नहीं कर रहे हैं और सुरक्षा कारणों से ईएनवी का प्रचार करने की उम्मीद कर रहे हैं। आपका प्रश्न, प्रभावी ढंग से जानबूझकर पूछ रहा है कि सुरक्षा कारणों के लिए मौजूद कई तंत्रों को कैसे हराया जाए।


बहुत विस्तृत जवाब (+10) मुझे निष्कर्ष भी पसंद है :) आपका स्वागत है!
Ruskes

मेरा सुझाव है कि सुरक्षा चेतावनी के साथ, ऐसा करने के लिए वास्तव में वैध कारण हो सकते हैं। यह सब आपके खतरे के मॉडल पर निर्भर करता है। यदि आप परीक्षण स्वचालन मशीनों का एक समूह स्थापित कर रहे हैं, तो ऐसा करने के लिए समझ में आ सकता है।
uchuugaka

2
के अनुसार stackoverflow.com/a/26311753/1081043 , /etc/launchd.confनहीं रह गया है OSX 10.10 Yosemite के रूप में काम करता है।
वारबकी

10

यदि आप उपयोग कर रहे हैं bash, तो /etc/profileसभी उपयोगकर्ताओं के लिए पर्यावरण चर सेट करना लागू होगा।

मेरे जोर के साथ bashOS X Mavericks पर मैनुअल से , (यह पिछले संस्करणों से नहीं बदला है):

जब बैश को एक इंटरेक्टिव लॉगिन शेल के रूप में या एक गैर-इंटरेक्टिव शेल के रूप में - एल्गिन विकल्प के रूप में लागू किया जाता है, तो यह पहले फ़ाइल / आदि / प्रोफाइल से कमांड को पढ़ता है और निष्पादित करता है, यदि वह फ़ाइल मौजूद है। उस फ़ाइल को पढ़ने के बाद, यह उस क्रम में ~ / .bash_profile, ~ / .bash_login और ~ / .profile की तलाश करता है, और पहले मौजूद से कमांड पढ़ता और कार्यान्वित करता है जो कि पढ़ने योग्य है।
...
यदि बैश को नाम श के साथ लगाया जाता है, तो यह पोस मानक के अनुरूप होने के साथ-साथ यथासंभव समीप के ऐतिहासिक संस्करणों के स्टार्टअप व्यवहार की नकल करने की कोशिश करता है । जब एक अंतर-सक्रिय इंटरएक्टिव सक्रिय लॉगिन शेल के रूप में लागू किया जाता है, या एक गैर-इंटरेक्टिव शेल - एल्गिन विकल्प के साथ, यह पहले / etc / प्रोफाइल से कमांड को पढ़ने और निष्पादित करने का प्रयास करता है। और ~ / .प्रोफाइल, उस क्रम में।


5

आप (और यह प्रश्न खोजने वाला कोई और) लगभग निश्चित रूप से निम्नलिखित मार्ग की तलाश में हैं:

/private/etc/paths

/private/etc/paths.dयदि आप मुख्य सिस्टम डिफ़ॉल्ट "पथ" कॉन्फ़िगरेशन दस्तावेज़ को बदलने से बचना चाहते हैं , तो आप हमेशा अपना संपादन डाल सकते हैं , लेकिन फिर उन्हें आपके $PATHचर के अंत में जोड़ा जाएगा , इसलिए यदि आप $PATH( के सामने) निर्देशिका जोड़ना चाहते हैं डिफ़ॉल्ट सिस्टम उपयोगिताओं को ओवरराइड करें, उदाहरण के लिए), आपको बस मुख्य /private/etc/pathsफ़ाइल को संपादित करना होगा और उन्हें सूची के शीर्ष पर जोड़ना होगा। उदाहरण के लिए, मैं एक फ़ोल्डर के लिए ऐसा करता हूं जिसमें मैं कुछ महत्वपूर्ण उपयोगिताओं के साथ-साथ अपने द्वारा बनाई गई कुछ लिपियों को संग्रहीत करता हूं, जैसे किmozjpeg, मैं चाहता हूं कि सिस्टम हमेशा डिफॉल्ट के बजाय इसका उपयोग करे, यह उस तरह से आता है (इस तरह सभी jpeg फ़ाइलों को बहुत अधिक किसी भी प्रोग्राम द्वारा सहेजा जाता है, नियमित सिस्टम cjpeg उपयोगिता की तुलना में 10% तक स्वचालित रूप से संपीड़ित हो जाता है - मैं उन्हें संकुचित कर दूंगा - '' ve ने पढ़ा कि इसका कारण अधिकांश प्रणालियों पर डिफ़ॉल्ट नहीं है क्योंकि यह बहुत धीमा है, लेकिन जब आप 0.02 सेकंड के विपरीत 0.14 सेकंड की तरह कुछ बात कर रहे हैं, तो "7 के कारक द्वारा धीमा" वास्तव में बहुत ज्यादा मतलब नहीं है कुछ भी ... यह मानते हुए कि यह सर्वर नहीं है)। मुझे पता है कि बहुत से लोग संभवतः इस प्रणाली में गहराई से संपादन करने की संभावित "खतरे" के बारे में चेतावनी देंगे, लेकिन मैं कहूंगा कि यदि आप इस तरह का उत्तर ढूंढ रहे हैं, तो आप शायद किसी भी उपयोगिता नामकरण से निपटने के लिए पर्याप्त जानते हैं भविष्य में संभावित रूप से उत्पन्न होने वाले संघर्ष,/private/etc/pathsवास्तव में उन्हें सभी उपयोगकर्ताओं / लॉगिन / इंस्टेंस के लिए संभव रूप से प्रचारित करता है - सभी प्रोग्राम, गोले आदि अपने $PATHचर के आधार का निर्माण करने के लिए उस फ़ाइल में पथों का उपयोग करेंगे ।

सच कहूं तो, मैं काफी हैरान हूं कि यहां किसी और ने अभी तक इसका उल्लेख नहीं किया है। SSH- विशिष्ट उपयोगों के बारे में लॉन्च और विकर्षण के साथ खिलवाड़ करने वाले सभी ... यह एक समाधान है जिसे कोई भी इस मूल मुद्दे की खोज कर रहा है, वह वास्तव में - स्वच्छ, सीधे-से-स्रोत, हमेशा काम करने वाला समाधान है।

वैसे, यदि आप सोच रहे हैं, तो ओएस एक्स /etcपर बस एक सिंबल है /private/etc, इसलिए आप आसानी से कर सकते हैं sudo nano /etc/pathsऔर उसी सटीक स्थान पर पहुंच सकते हैं । उपरोक्त पथ फ़ाइल का पूर्ण वास्तविक पथ है।


2
जब तक मैं कुछ याद नहीं कर रहा हूँ, वह केवल एक सिस्टम-वाइड वातावरण चर सेट करेगा - $PATH। ओपी एक सामान्य समाधान की तलाश में लग रहा है - किसी भी env var को सेट करना , सिस्टम-वाइड, उदा $EDITOR, आदि
John N

यहां तक ​​कि sudoकमांड के साथ , macOS सिएरा में, मुझे अनुमति नहीं मिलती है अगर मैं पथ को जोड़ने echoमें एक नई फ़ाइल का उपयोग करके बनाने की कोशिश करता हूं /private/etc/paths.d। लेकिन यह पहले फ़ाइल बनाने के लिए काम करता है, फिर फ़ाइल sudo mvको स्थानांतरित करने के लिए उपयोग करें /private/etc/paths.d
मुरैना

इससे मदद मिली। अन्य निर्देशिकाएं मेरे पैट में $ PATH की स्थापना के बावजूद मेरे PATH में शामिल हो रही थीं ~/.zshrc... अपराधी वास्तव में था /private/etc/pathsऔर मुझे इस फाइल को अपडेट करना था। धन्यवाद।
nonbeing

1

~/.bashrcजब मैं SSH के माध्यम से अपनी मशीन से जुड़ा था , तो मुझे एक समान समस्या थी, विशेष रूप से खट्टा नहीं हो रहा था। मैंने पाया कि SSHd के लिए एक कॉन्फ़िगरेशन सेटिंग को बदलकर चाल चली गई। शायद आपकी समस्या भी SSH डेमॉन के साथ है?

निम्नानुसार SSH सेवा की कॉन्फ़िगरेशन फ़ाइल को संशोधित करें:

# /etc/sshd_config
PermitUserEnvironment yes

फिर सिस्टम प्राथमिकता> साझाकरण में दूरस्थ लॉगिन सेवा को पुनरारंभ करें।

से sshd_configमैनपेज:

 PermitUserEnvironment
         Specifies whether ~/.ssh/environment and environment= options in
         ~/.ssh/authorized_keys are processed by sshd(8).  The default is
         ``no''.  Enabling environment processing may enable users to
         bypass access restrictions in some configurations using mecha-
         nisms such as LD_PRELOAD.

(यदि यह मदद करता है, तो मैंने लिखा है कि मैंने अपनी व्यक्तिगत विकि पर इसका परीक्षण कैसे किया है )


1

यदि अन्य सामान्य ग्राफ़िकल लॉगिन सत्र से शुरू की गई प्रक्रियाओं के लिए पर्यावरण चर सेट करने का तरीका खोजते हैं, तो आप उपयोग कर सकते हैं /etc/launchd.conf। उदाहरण के /usr/local/binलिए, डिफ़ॉल्ट पथ में जोड़ें , चलाएं

echo setenv PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin|sudo tee -a /etc/launchd.conf

और परिवर्तनों को लागू करने के लिए पुनः आरंभ करें। परिवर्तनों को लागू करने का एक और तरीका launchctl</etc/launchd.conf;sudo launchctl</etc/launchd.confप्रक्रियाओं को चलाना और फिर से भरना है।


/etc/launchd.conf का अब लॉन्च में बिल्कुल भी उपयोग नहीं किया जाता है।
uchuugaka

2
/etc/launchd.confOSX 10.10 योसेमाइट के बाद से अब समर्थित नहीं है
समझदार 12

0

हम्म ... मैक ओएस एक्स 10.10.5 के रूप में और शायद पहले, man -s5 launchd.confहमें बताता है: " launchd.conf is no longer respected by the system." मेरे पास बहुत अधिक सामान अभी चल रहा है फ़ाइल में डमी चर डालते हैं और यह देखने के लिए पुनरारंभ करते हैं कि क्या यह वास्तव में काम करता है या नहीं सभी, लेकिन प्रलेखन का कहना है कि यह काम नहीं करना चाहिए।

मुझे पूरा यकीन है कि यह नहीं होगा। करो man launchctlऔर तुम देखोगे: " The /etc/launchd.conf file is no longer consulted for subcommands to run during early boot time; this functionality was removed for security considerations."

आप जो कुछ भी कर सकते हैं वह सभी पर्यावरण चर आप किसी फ़ाइल में वैश्विक-ईश के रूप में करना चाहते हैं, शायद environmentलिनक्स के साथ रखने के लिए कहा जाता है, या (अगर बाद में Apple उस के साथ कुछ करने का फैसला करता है - तो आप कभी नहीं जानते) environment.conf, जैसे मैंने किया था, फिर इसके माध्यम से स्रोत /etc/profile:

if [ -f /etc/environment.conf ]; then
   source /etc/environment.conf
fi

या, यदि आप कॉम्पैक्ट प्रारूप पसंद करते हैं:

if [ -f /etc/environment.conf ]; then . /etc/environment.conf; fi

यदि आप बैश के अलावा किसी अन्य शेल का उपयोग करते हैं , और यह बैश के रूप में वैरिएबल-सेटिंग सिंटैक्स का उपयोग करता है (जैसा कि zsh, मुझे लगता है), तो आपको उस शेल के सिस्टम-वाइड आरसी फ़ाइल (जैसे /etc/zshrc) से भी इस फ़ाइल को स्रोत करना होगा । यदि आप एक शेल का उपयोग करते हैं जो एक अलग सिंटैक्स का उपयोग करता है, उदाहरण के लिए tcsh, तो आपको उस शेल के लिए एक समान फ़ाइल बनाए रखने की आवश्यकता होगी और इसे शेल के सिस्टम-वाइड आरसी फ़ाइल (जैसे /etc/csh.cshrctcsh) के लिए स्रोत से , या बेहतर अभी तक एक स्क्रिप्ट बनाएँ यह स्वतः उत्पन्न करता है, इसलिए आपको चर को जोड़ने / बदलने के लिए केवल एक फ़ाइल को संपादित करना होगा। यह इस तरह के एक ट्यूटोरियल के लिए जगह नहीं है; Google पर कुछ सेकंड कैसे बदल गए [t] csh वेरिएबल एक्सपोर्ट को bash syntax में, https://stackoverflow.com/questions/2710790/how-to-source-a-csh-script-in-bash पर। सेट-पर्यावरण, इसलिए शायद दूसरी दिशा में जाने के लिए कुछ उपलब्ध है।

यह मेरा अनुभव रहा है कि मैक ओएस एक्स पूर्वानुमानित आरसी फ़ाइल व्यवहार से आगे और आगे बढ़ रहा है। कम से कम 10.8 तक, यह अब लोड करने के लिए प्रतीत नहीं होता है /etc/rc.common, /etc/rc.confया /etc/rc.<anything>, और न ही (कम से कम 10.9 के बाद) यह /etc/bash.bashrcइंटरएक्टिव नोजलीन गोले के लिए लोड होगा (जो कि निश्चित रूप से यह करना चाहिए, जैसे यह ~/.bashrcउनके लिए लोड करता है, फिर भी, 10.10 के रूप में) । फिर से मेरे पास फिन्क, मैकपोर्ट्स, और होमब्रे सभी सामान स्थापित करने हैं, इसलिए शायद उनमें से एक डिफ़ॉल्ट डॉटफ़ाइल व्यवहार के साथ हस्तक्षेप कर रहा है। YMMV।


प्रश्न पहले के OS X के लिए है। अन्य उदाहरण के लिए Apple.stackexchange.com/questions/215932/… बाद के लिए होगा
user151019

मेरे पोस्ट ने Mavericks (10.9) भाग में और 10.10 भाग दोनों को संबोधित किया। यदि आपकी बात यह है कि 10.10 पूरी तरह से एक धागे में पूरी तरह से 10.9 के बारे में एक शब्दकोष विषय है, तो मुझे यकीन नहीं है कि आपने मुझे 10.11 धागे पर क्यों निर्देशित किया, जहां 10.10 भी ऑफ-टॉपिक होगा (यदि प्रश्न में धागा अमान्य नहीं था वैसे भी बंद)। जबरदस्त हंसी।
एस। मैककैंडलिश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.