मैं अक्सर एक उपयोगकर्ता आईडी से जुड़ा लॉगिन नाम प्राप्त करना चाहता हूं और क्योंकि यह एक सामान्य उपयोग मामला साबित होता है, इसलिए मैंने ऐसा करने के लिए एक शेल फ़ंक्शन लिखने का फैसला किया। जब मैं मुख्य रूप से जीएनयू / लिनक्स वितरण का उपयोग करता हूं, तो मैं अपनी स्क्रिप्ट को यथासंभव पोर्टेबल होने की कोशिश करता हूं और यह जांचने के लिए कि मैं क्या कर रहा हूं, पॉसिक्स-संगत है।
पार्स /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
लॉगिन नामों के लिए यूआईडी का अनुवाद करने के लिए उपयोग करता है। गिल्स का जवाब इसे पूरा करने का एक अधिक प्रत्यक्ष और कुशल तरीका है।