मैं अक्सर एक उपयोगकर्ता आईडी से जुड़ा लॉगिन नाम प्राप्त करना चाहता हूं और क्योंकि यह एक सामान्य उपयोग मामला साबित होता है, इसलिए मैंने ऐसा करने के लिए एक शेल फ़ंक्शन लिखने का फैसला किया। जब मैं मुख्य रूप से जीएनयू / लिनक्स वितरण का उपयोग करता हूं, तो मैं अपनी स्क्रिप्ट को यथासंभव पोर्टेबल होने की कोशिश करता हूं और यह जांचने के लिए कि मैं क्या कर रहा हूं, पॉसिक्स-संगत है।
पार्स /etc/passwd
मैंने जो पहली कोशिश की वह पार्स /etc/passwd(उपयोग करना awk) थी।
awk -v uid="$uid" -F: '$3 == uid {print $1}' /etc/passwd
हालांकि, इस दृष्टिकोण के साथ समस्या यह है कि लॉगिन स्थानीय नहीं हो सकते हैं, उदाहरण के लिए, उपयोगकर्ता प्रमाणीकरण एनआईएस या एलडीएपी के माध्यम से हो सकता है।
getentकमांड का उपयोग करें
उपयोग getent passwdकरने से पार्स करने से अधिक पोर्टेबल है /etc/passwdक्योंकि यह गैर-स्थानीय एनआईएस या एलडीएपी डेटाबेस पर भी सवाल उठाता है।
getent passwd "$uid" | cut -d: -f1
दुर्भाग्य से, getentउपयोगिता POSIX द्वारा निर्दिष्ट नहीं लगती है।
idकमांड का उपयोग करें
id उपयोगकर्ता की पहचान के बारे में डेटा प्राप्त करने के लिए POSIX- मानकीकृत उपयोगिता है।
BSD और GNU कार्यान्वयन एक उपयोगकर्ता आईडी को एक ऑपरेंड के रूप में स्वीकार करते हैं:
इसका अर्थ है कि इसका उपयोग उपयोगकर्ता आईडी से जुड़े लॉगिन नाम को प्रिंट करने के लिए किया जा सकता है:
id -nu "$uid"
हालाँकि, उपयोगकर्ता आईडी प्रदान करना क्योंकि संचालन POSIX में निर्दिष्ट नहीं है; यह केवल ऑपरेंड के रूप में एक लॉगिन नाम के उपयोग का वर्णन करता है ।
उपरोक्त सभी को मिलाकर
मैंने उपरोक्त तीन दृष्टिकोणों को निम्नलिखित की तरह संयोजित करने पर विचार किया:
get_username(){
uid="$1"
# First try using getent
getent passwd "$uid" | cut -d: -f1 ||
# Next try using the UID as an operand to id.
id -nu "$uid" ||
# As a last resort, parse `/etc/passwd`.
awk -v uid="$uid" -F: '$3 == uid {print $1}' /etc/passwd
}
हालांकि, यह क्लंकी है, असभ्य और - अधिक महत्वपूर्ण बात - मजबूत नहीं; यदि उपयोगकर्ता आईडी अमान्य है या मौजूद नहीं है, तो यह एक गैर-शून्य स्थिति से बाहर निकलता है। इससे पहले कि मैं एक लंबी और क्लंकियर शेल स्क्रिप्ट लिखूं जो प्रत्येक कमांड आह्वान के निकास की स्थिति का विश्लेषण और संग्रह करता है, मैंने सोचा कि मैं यहां पूछूंगा:
क्या उपयोगकर्ता आईडी से लॉगिन नाम प्राप्त करने का एक और अधिक सुरुचिपूर्ण और पोर्टेबल (POSIX- संगत) तरीका है?
getentऔर न ही idपहला मैच पिछले कुछ भी प्राप्त होगा; उन सभी को खोजने का एकमात्र तरीका सभी उपयोगकर्ताओं को एन्यूमरेट करना है, यदि उपयोगकर्ता डेटाबेस इसकी अनुमति देता है। ( /etc/passwdवहाँ परिभाषित उपयोगकर्ताओं के लिए काम करता है, स्पष्ट रूप से देख रहे हैं।)
/etc/passwdऔर /etc/shadowइस परिदृश्य का परीक्षण करने के लिए ऐसी प्रविष्टि बनाई और सत्यापित किया कि दोनों idऔर getent passwdजैसा आप वर्णन करते हैं वैसा ही व्यवहार करते हैं। यदि, किसी स्तर पर, मैं एक ऐसी प्रणाली का उपयोग कर रहा हूं, जहां एक उपयोगकर्ता के कई नाम हैं, तो मैं इन सिस्टम उपयोगिताओं के समान ही करूंगा और बस उस उपयोगकर्ता के लिए विहित नाम के रूप में पहली घटना का इलाज करूंगा।
setuid(some_id), और इसकी कोई आवश्यकता नहीं है जो some_idकिसी भी उपयोगकर्ता डेटाबेस का हिस्सा हो सकता है। लिनक्स पर उपयोगकर्ता नामस्थान जैसी चीजों के साथ यह आपकी लिपियों के लिए एक अपंग धारणा हो सकती है।
getpwuid()फ़ंक्शन को कॉल करने के एक महंगे तरीके की तरह लगता है जो lsलॉगिन नामों के लिए यूआईडी का अनुवाद करने के लिए उपयोग करता है। गिल्स का जवाब इसे पूरा करने का एक अधिक प्रत्यक्ष और कुशल तरीका है।