मैं बश में वर्तमान उपयोगकर्ता का उपयोगकर्ता नाम कैसे प्राप्त कर सकता हूं?


321

मैं बैश में एक कार्यक्रम लिख रहा हूं जिसे उपयोगकर्ता का उपयोगकर्ता नाम प्राप्त करने की आवश्यकता है।

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

वर्तमान उपयोगकर्ता नाम प्राप्त करने के लिए मैं किस कमांड का उपयोग करता हूं?


ऐसा लगता है कि $ USER पर निर्भर हुए या एक अलग प्रक्रिया लागू किए बिना अब तक प्रस्तावित विधियों में से कोई भी नहीं है। क्या बिना किसी अलग प्रक्रिया को लागू किए उपयोगकर्ता नाम प्राप्त करने के लिए कोई बैश बिलियन नहीं है?
कॉलिनएम

9
जब आपने एक आदेश सुना है, लेकिन यह सुनिश्चित नहीं है कि इसका उपयोग कैसे किया जाए, man whoamiतो आमतौर पर प्रलेखन के लिए जाँच करना एक अच्छा पहला पड़ाव होता है।
मार्क स्टोसबर्ग

जवाबों:


470

कमांड लाइन पर, दर्ज करें

whoami

या

echo "$USER"

एक चर के लिए इन मूल्यों को बचाने के लिए, करते हैं

myvariable=$(whoami)

या

myvariable=$USER

बेशक, आपको एक चर बनाने की आवश्यकता नहीं है क्योंकि वह वह $USERचर है जो इसके लिए है।


53
यदि आपका USER किसी अन्य उपयोगकर्ता के रूप में कमांड चला रहा है, तो बस एक त्वरित टिप्पणी कि $ USER और whoami अलग-अलग मान लौटाते हैं। whoami OS उपयोगकर्ता को वापस करता है और USER $ ssh उपयोगकर्ता को लौटाता है।
बिलमैन

4
@BillMan, इसका क्या मतलब है? क्या आप एक उदाहरण प्रदान कर सकते हैं?
देजय क्लेटन

17
कुछ मामलों में, $USERबिल्कुल निर्धारित नहीं है। इससे भी बदतर, यह सिर्फ एक पर्यावरण चर है, इसलिए इसे उपयोगकर्ता द्वारा ओवरराइड किया जा सकता है:USER=thisisnotmyname bash -c 'echo $USER' # prints thisisnotmyname
sitaktif

1
@sitaktif आप इस समस्या के समाधान के रूप में क्या सुझाव देते हैं?
सेठमोर्टन

3
@ SethMMorton मुझे एहसास है कि मैंने इस मुद्दे को ध्वनि की तुलना में बदतर बना दिया है जो आमतौर पर है। प्रश्न का उत्तर देने के लिए, हालांकि, whoami(जैसा कि आपने सुझाव दिया था) समस्या को पूरी तरह से समाप्त कर देता है, यह मानते हुए कि ओवरराइड वातावरण चर आपके संदर्भ में एक संभावित मुद्दा है।
सिटाकिफ

81

का एक विकल्प whoamiहै id -u -n

id -uउपयोगकर्ता आईडी (जैसे 0 रूट के लिए ) वापस करेगा ।


5
जब तक मैं गलत कर रहा हूँ इस अगर पोर्टेबिलिटी के रूप में एक चिंता का विषय है जाने के लिए तरीका होगा idकमान और -uऔर -nझंडे का एक हिस्सा हैं POSIX

3
यह वास्तव में स्वीकृत उत्तर होना चाहिए। "${USER}"और whoamiदोनों इस बात पर निर्भर करते हैं कि आप कैसे लॉग इन करते हैं। विशेष रूप से, लॉगिन गोले और सुडो $ USER सेट करेंगे, और whoamiस्टड से जुड़े उपयोगकर्ता को देखेंगे। हालांकि, यदि आप क्रोन से बैच की नौकरी कर रहे हैं, या आप रूट की तुलना में एक अलग उपयोगकर्ता के रूप में एक स्टार्टअप स्क्रिप्ट चला रहे हैं, तो ये या तो गलत उपयोगकर्ता (रूट) या कुछ भी नहीं आउटपुट करेंगे। यह उत्तर प्रक्रिया के उपयोगकर्ता आईडी को देखते हुए सही मान लौटाएगा।
असफंद काजी

यह उपयोगी नहीं है यदि आप आईडी के बजाय उपयोगकर्ता नाम चाहते हैं
जोनाथन

3
यदि आपने असत्य टिप्पणियों को जोड़ने से पहले कमांड की कोशिश की, तो आप देखेंगे कि -nतर्क उपयोगकर्ता नाम को प्रिंट करता है, जैसे कि मूल प्रश्न पूछा गया था। निम्नलिखित देखें: id -u -nप्रिंट brett- डार्विन पर भी।
ब्रेट

20

lognameउपयोगकर्ता में लॉग इन को पुनः प्राप्त करने के लिए मानक यूनिक्स / लिनक्स / बीएसडी / मैकओएस कमांड का उपयोग करें। यह पर्यावरण के साथ-साथ सूडो की भी अनदेखी करता है, क्योंकि ये अविश्वसनीय पत्रकार हैं। यह हमेशा उपयोगकर्ता के नाम में लॉग इन प्रिंट करेगा और फिर बाहर निकल जाएगा। यह कमान लगभग 1981 से चली आ रही है।

My-Mac:~ devin$ logname
devin
My-Mac:~ devin$ sudo logname
Password:
devin
My-Mac:~ devin$ sudo su -
My-Mac:~ root# logname
devin
My-Mac:~ root# echo $USER
root

17

मेरे द्वारा सोलारिस 9 और लिनक्स पर उपयोग की गई एक हैक और जो उन दोनों के लिए ठीक काम करती है:

ps -o user= -p $$ | awk '{print $1}'

यह स्निपेट वर्तमान ईयूआईडी के साथ उपयोगकर्ता के नाम को प्रिंट करता है।

ध्यान दें: आपको यहां दुभाषिया के रूप में बैश की आवश्यकता है।

सोलारिस पर आपको ऊपर वर्णित विधियों के साथ समस्या है:

  • id-uऔर -nमापदंडों को स्वीकार नहीं करता है (इसलिए आपको आउटपुट पार्स करना होगा)
  • whoami मौजूद नहीं है (डिफ़ॉल्ट रूप से)
  • who am I वर्तमान टर्मिनल के मालिक (यूरोपीय संघ की उपेक्षा)
  • $USERचर केवल प्रोफ़ाइल फ़ाइलों को पढ़ने के बाद सही तरीके से सेट किया गया है (उदाहरण के लिए, /etc/profile)

1
दुभाषिए के रूप में आपको बैश की आवश्यकता क्यों है? दिखाए गए कमांड लाइन में कुछ भी किसी भी शेल के लिए विशिष्ट नहीं लगता है। वास्तव में, क्यों जाग के माध्यम से भी पाइप को शामिल करें? जहाँ तक मैं बता सकता हूँ, आपकी psआज्ञा वर्तमान शेल के पिड के मालिक को प्रदर्शित करने के लिए आवश्यक है।
घट्टी

हमारे लिए मानव के रूप में अति सूक्ष्म जानकारी की अवहेलना स्वाभाविक है। Awk हिस्सा वांछित डेटा को अलग करता है - चर या सामान्य रूप से कंप्यूटर के लिए जो इस अल्पविकसित स्तर पर अभी तक मक्खी की धारणाओं पर नहीं कर सकता है।
ब्रैडकिसने79

सोलारिस पर, command -p id(POSIX शेल से) का उपयोग करें या /usr/xpg4/bin/id। आमतौर पर, सोलारिस पर, आप अपने पर्यावरण को 70 के दशक / 80 के दशक के आदेशों से बचने से बचने के लिए अपने आप को एक POSIX वातावरण में डाल सकते हैं ( PATH=getconf PATH` और चलाने के लिए सुनिश्चित होना /usr/xpg4/bin/sh)।
स्टीफन चेजलस

'पीएस: अज्ञात विकल्प - ओ'
आनंद रॉकज

12

दो आदेश:

  1. id समूहों के साथ उपयोगकर्ता आईडी प्रिंट करता है। प्रारूप:uid=usernumber(username) ...

  2. whoami वर्तमान उपयोगकर्ता नाम देता है


1
$ whoami बाश में एक चर के रूप में उपलब्ध नहीं है । आपको वास्तव में whoami कमांड निष्पादित करने के लिए $ (whoami), या `whoami` करने की आवश्यकता है!
रुडोल्फ मेयर

@ रुडोल्फमेयर मैंने इसे ठीक कर दिया
१२'१j को

6

जब रूट (sudo) अनुमतियों की आवश्यकता होती है, जो आमतौर पर स्क्रिप्ट का उपयोग करते समय 90% + होती है, तो पिछले उत्तरों में दिए गए तरीके हमेशा आपको rootउत्तर के रूप में देते हैं।

वर्तमान "लॉग इन" उपयोगकर्ता प्राप्त करने के लिए बस उतना ही सरल है, लेकिन इसके लिए अलग-अलग चर को एक्सेस करने की आवश्यकता है: $SUDO_UIDऔर $SUDO_USER

उन्हें प्रतिध्वनित किया जा सकता है:

echo $SUDO_UID
echo $SUDO_USER

या उदाहरण के लिए, सौंपा गया:

myuid=$SUDO_UID
myuname=$SUDO_USER

6

में सोलारिस ओएस मैं इस आदेश का प्रयोग किया:

$ who am i     # Remember to use it with space.

लिनक्स पर- किसी ने पहले ही टिप्पणियों में इसका जवाब दिया।

$ whoami       # Without space

5

के लिए बैश , के शेल ( ksh), shआदि अपने प्रश्नों में से कई लोग जल्दी से या तो द्वारा उत्तर दिया रहे हैं:

man [function]

आपके द्वारा उपयोग की जा रही प्रणाली या आमतौर पर अधिक आसानी से प्रलेखन प्राप्त करने के लिए:

Google "मैन फ़ंक्शन"

यह कुछ चीजों के लिए अलग-अलग परिणाम दे सकता है जहां लिनक्स और यूनिक्स में मामूली अंतर है।

इस सवाल के लिए, बस अपने शेल में "हूमी" दर्ज करें।

इसे स्क्रिप्ट करने के लिए:

myvar=$(whoami)

2

वर्तमान उपयोगकर्ता के उपयोगकर्ता नाम के साथ शुद्ध बैश में प्राप्त किया जा सकता है ${parameter@operator} पैरामीटर विस्तार के (बैश 4.4 में पेश किया गया है):

$ : \\u
$ printf '%s\n' "${_@P}"

:बिल्ट-इन (के पर्याय true) अंतिम तर्क है, जो में संग्रहित है की स्थापना करके एक अस्थायी चर के बजाय प्रयोग किया जाता है$_ । हम तब इसका विस्तार करते हैं ( \uजैसे कि यह एक त्वरित स्ट्रिंग के साथ थाP ऑपरेटर के ।

यह उपयोग करने से बेहतर है $USER, जैसा $USERकि सिर्फ एक नियमित पर्यावरणीय चर है; इसे संशोधित किया जा सकता है, परेशान किया जा सकता है, आदि। भले ही यह जानबूझकर छेड़छाड़ न की गई हो, एक सामान्य मामला जहां यह अभी भी गलत है जब उपयोगकर्ता एक लॉगिन शेल ( suडिफ़ॉल्ट) शुरू किए बिना स्विच किया जाता है ।


1

पर सबसे Linux सिस्टम, बस टाइपिंग Whoami कमांड लाइन पर यूजर आईडी प्रदान करता है।

हालांकि, सोलारिस पर, आपको नीचे दिए गए कमांड के माध्यम से लॉग-इन किए गए उपयोगकर्ता के यूआईडी का निर्धारण करके, उपयोगकर्ता आईडी का निर्धारण करना पड़ सकता है।

echo $UID

UID ज्ञात होने के बाद, /etc/passwdफ़ाइल के विरुद्ध UID मिलान करके उपयोगकर्ता को खोजें ।

cat /etc/passwd | cut -d":" -f1,3

-4

वर्तमान कार्य के user_struct को प्राप्त करें

#define get_current_user()              \
({                                      \
    struct user_struct *__u;            \
    const struct cred *__cred;          \
    __cred = current_cred();            \
    __u = get_uid(__cred->user);        \
    __u;                                \
})

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