$ USER और USERNAME पर्यावरण चर कौन सेट करता है?


34

इसके अलावा, क्या ये चर हमेशा लॉग-इन उपयोगकर्ता नाम (वे मेरे डेबियन सिस्टम पर करते हैं) से मेल खाते हैं? क्या मैं अन्य यूनिक्स (जैसे) सिस्टम में उनकी उपलब्धता मान सकता हूं?

मुझे यह भी उत्सुकता है कि इनमें से whoamiकिसी भी चर को पढ़ने के बजाय एक का उपयोग क्यों किया जाएगा ।


2
manपृष्ठ को देखते हुए , whoamiआपके प्रभावी उपयोगकर्ता आईडी से जुड़े नाम की रिपोर्ट करता है। इसका मतलब यह है कि अगर आप sudoएक सेतु निष्पादन योग्य का उपयोग कर रहे हैं या चल रहे हैं तो यह कुछ अलग लौटाएगा । यदि आपने sudoसेट किया है, तो sudo whoamiउदाहरण के लिए प्रयास करें ।
जोसेफ़ आर।

4
USERऔर USERNAMEसाधारण पर्यावरण चर हैं, जिसका अर्थ है कि, यदि आप चाहें, तो आप उन्हें मनमाना मान दे सकते हैं। बस टाइप करें USER=xyz। दूसरे शब्दों में, भले ही वे चर मौजूद हों, इस बात की कोई गारंटी नहीं है कि उनके मूल्य वर्तमान में लॉग-इन उपयोगकर्ता नाम से मेल खाते हैं।
उवे

@ फिर भी guarantee, मेरा मतलब डिफ़ॉल्ट रूप से है (अर्थात उपयोगकर्ता ने उन्हें नहीं बदला)।
tshepang

2
@Tshepang मेरी पहली टिप्पणी के लिए अनुवर्ती के रूप में: के परिणामों की तुलना करें sudo whoamiऔरsudo echo $USER
यूसुफ आर।

2
@JosephR। के लिए sudo echo $USER, शेल का विस्तार होता है $USER, फिर कॉल करता है sudo। तो निश्चित रूप से यह उतना ही उत्पादन नहीं करता है whoami। जैसे sudo whoami, sudo sh -c 'echo $USER'(आमतौर पर) आउटपुट होता है rootईयूआईडी का उपयोग करने के बारेwhoami में आपकी टिप्पणी के बारे में , ध्यान दें कि यूआईडी का उपयोग करने पर भी sudo whoamiआउटपुट होगा । यह चलाने के लिए EUID और UID दोनों को सेट करता है (बहुत असामान्य स्थिति को छोड़कर जो आप इसे अन्यथा व्यवहार करने के लिए स्पष्ट रूप से कॉन्फ़िगर करते हैं)। से तुलना करें । rootwhoamisudosudo id -usudo id -ru
एलियाह कगन

जवाबों:


29

आईटी इस लॉगिन है

लिनक्स लॉगिन (1) मैन पेज कहता है:

के लिए मूल्य $ HOME , $ उपयोगकर्ता , $ शेल , $ पथ , $ LOGNAME , और $ मेल पासवर्ड प्रविष्टि में उचित क्षेत्रों के अनुसार सेट कर रहे हैं।

फ्रीबीएसडी लॉगिन (1) मैन पेज कहता है:

लॉग इन उपयोगिता वातावरण में जानकारी में प्रवेश करती है (देखें वातावरण (7) ) उपयोगकर्ता के घर निर्देशिका (गृह), कमांड दुभाषिया (शेल), खोज पथ (पथ), टर्मिनल प्रकार (शब्द) और उपयोगकर्ता का नाम निर्दिष्ट (दोनों LOGNAME और उपयोगकर्ता) ।

NetBSD , OpenBSD और ओएस एक्स आदमी पृष्ठों का कहना है कि एक ही बात।

यहाँ उपयोग -लिनक्स लॉगिन से स्रोत कोड है:

setenv("HOME", pwd->pw_dir, 0); /* legal to override */
setenv("USER", pwd->pw_name, 1);
setenv("SHELL", pwd->pw_shell, 1);
/* ... */
setenv("LOGNAME", pwd->pw_name, 1);

यहाँ FreeBSD लॉगिन से स्रोत कोड है:

(void)setenv("LOGNAME", username, 1);
(void)setenv("USER", username, 1);
(void)setenv("PATH", rootlogin ? _PATH_STDPATH : _PATH_DEFPATH, 0);

2
मेरी फेडोरा 16 बॉक्स पर, मैं दोनों है USERऔर USERNAMEसेट और अपने आदेश केवल रिटर्न LOGNAME
जोसेफ आर।

1
@ जोसेफ।, दुर्भाग्य से मेरे हाथ में फेडोरा नहीं है, लेकिन मैंने फ्रीबीएसडी के स्रोतों में भी देखा है,
यूपीडी

लेकिन यह स्पष्ट रूप से फेडोरा पर मामला नहीं है। मैं बस इतना ही कह रहा हूं कि loginइन चरों को स्थापित करना एकमात्र बात नहीं है।
जोसेफ आर।

1
ध्यान दें कि लिनक्स एक कर्नेल है, इसमें loginकमांड नहीं है । ऐसे लिनक्स जो अपने कर्नेल के रूप में लिनक्स का उपयोग करते हैं, वे किसी भी क्रियान्वयन का उपयोग करने के लिए स्वतंत्र हैं। उदाहरण के लिए, डेबियन आधारित सिस्टम छाया-बर्तनों में से एक का उपयोग करते हैं, उपयोग-लिनेक्स से नहीं।
स्टीफन चेजेलस

1
ध्यान दें कि loginअक्सर ओवरग्राउंड sshया ज्यादातर ग्राफिकल लॉगिन मैनेजरों द्वारा लॉग इन करते समय इनवोक नहीं किया जाता है ।
स्टीफन चेजलस

11

कोई नियम नहीं है। कुछ गोले जैसे tcshया zshसेट $LOGNAMEzshसेट करता है $USER

यह कुछ चीजें हैं जो आप की तरह में प्रवेश करें द्वारा निर्धारित किया जा सकता है login(के रूप में द्वारा लाया gettyकी तरह अन्य बातों के द्वारा एक टर्मिनल पर लॉगिन और कभी कभी in.rlogind), cron, su, sudo, sshd, rshd, चित्रमय लॉगिन प्रबंधकों या नहीं हो सकता।

यदि मेरे अनुभव में एक लॉगिन है, $USERतो आमतौर पर सेट किया जाता है , लेकिन उस लॉगिन सत्र के भीतर उपयोगकर्ता आईडी (सेतु के आदेशों के माध्यम से) के परिवर्तन के बाद इसे अपडेट नहीं किया जा सकता है। POSIX की आवश्यकता है कि $LOGNAMEलॉगिन (और cron) पर सेट किया जाए ।

लॉगिन नाम को आसानी से प्राप्त करने के लिए, lognameकमांड का उपयोग करना सबसे अच्छा है (यदि कोई लॉगिन नहीं हुआ है, तो यह कुछ भी नहीं लौटा सकता है)। उपयोगकर्ता आईडी प्राप्त करने के लिए, का उपयोग करें id -u। वर्तमान प्रभावी उपयोगकर्ता आईडी के अनुरूप एक उपयोगकर्ता नाम पाने के लिए id -un:। उन सभी को प्राप्त करने के लिए (अधिकांश समय, उपयोगकर्ता आईडी प्रति केवल एक उपयोगकर्ता नाम है, लेकिन इसकी गारंटी नहीं है):

perl -le 'while ($n = getpwent()) {print $n if getpwnam($n) == $>}'

हालांकि यह उन प्रणालियों पर काम नहीं कर सकता है जहां उपयोगकर्ता डेटाबेस को एनुमरेट नहीं किया जा सकता है (उदाहरण के लिए नेटवर्क उपयोगकर्ता डेटाबेस के साथ कभी-कभी ऐसा होता है)।


3

आप शायद यहां POSIX मानक पर भरोसा करना चाहते हैं, क्योंकि किसी समय में आप न केवल उपयोगकर्ता लॉगिन ( loginप्रोग्राम द्वारा प्रबंधित ) बल्कि cronनौकरियों और इस तरह की परवाह करेंगे ।

इसलिए, आपको पता होना चाहिए कि POSIX की आवश्यकता है $LOGNAMEलेकिन नहीं $USER। उदाहरण के लिए $USERक्रोन द्वारा सेट नहीं किया जा सकता है, जैसा कि कीथ थॉम्पसन द्वारा एक उत्तर में बताया गया है , जो कुछ इतिहास को भी संदर्भित करता है कि यह सिस्टम-वी बनाम बीएसडी के इतिहास से कैसे संबंधित है:

... कम से कम मेरे सिस्टम पर (Ubuntu 14.04) $ USER पर्यावरण चर्या क्रोन नौकरियों के लिए निर्धारित नहीं है। इसके बजाय, आप $ LOGNAME का उपयोग कर सकते हैं, जो क्रोन नौकरियों के लिए पर्यावरण का हिस्सा है।

के अनुसार वातावरण (7) आदमी पेज (प्रकार आदमी वातावरण इसे पढ़ने के लिए), $ उपयोगकर्ता बीएसडी व्युत्पन्न कार्यक्रमों के द्वारा प्रयोग किया जाता है और $ LOGNAME प्रणाली वी व्युत्पन्न कार्यक्रमों के द्वारा प्रयोग किया जाता है।


1

आप (बजाय वातावरण चर उपयोग करना चाहते हैं whoamiया getpwentऔर getpwnam) और यदि आप अनिश्चित हैं अगर वे हमेशा सभी * NIX सिस्टम पर एक ही तरह से स्थापित कर रहे हैं, तो पार्टी में इस प्रयास करें:

THIS_USER=${USER:-${USERNAME:-${LOGNAME}}}
echo ${THIS_USER}

यदि यह सब के बाद भी खाली है, तो आप एक गूढ़ प्रणाली पर हैं। ;)

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