पता करें कि क्या उपयोगकर्ता नाम मौजूद है


68

शेल स्क्रिप्ट में मैं कैसे पता लगा सकता हूं कि क्या मौजूदा सिस्टम पर किसी उपयोगकर्ता का नाम मौजूद है?


/etc/passwdऔर /etc/shadowअपूर्ण हैं। OS X की डायरेक्टरी सर्विसेज या लिनक्स पर इसी तरह एक्टिव डायरेक्ट्री इंटीग्रेशन पर विचार करें।

जवाबों:


103

इसके लिए उपयोग किए जाने वाले सबसे बुनियादी साधनों में से एक संभवतः है id

#!/bin/bash
if id "$1" >/dev/null 2>&1; then
        echo "user exists"
else
        echo "user does not exist"
fi

जो पैदा करता है

$ ./userexists root
user exists
$ ./userexists alice
user does not exist
$ ./userexists
user does not exist

2
आप यहाँ backquotes की जरूरत नहीं है - बस का उपयोग करें if id -u "$1" >/dev/null 2>&1; then...
गॉर्डन डेविसन 17'11

1
@ बोर्डन बिल्कुल सही है। धन्यवाद :)
बरबज

"
-यू

यदि मुझे ifनकारात्मक परिणाम चेकर की आवश्यकता है तो क्या होगा?
यूरा शिनकरेव

id -u $1 1>/dev/null 2>&1; echo $?पाइप के लिए इस्तेमाल किया जा सकता है
जेसनवेय

20

getent

इस कमांड को उन डेटाबेस के लिए प्रविष्टियाँ एकत्र करने के लिए डिज़ाइन किया गया है जो / etc फ़ाइलों और LDAP, AD, NIS / Yellow Pages, DNS और पसंद जैसी विभिन्न दूरस्थ सेवाओं द्वारा समर्थित हो सकते हैं।

यह जानने के लिए कि क्या यूज़रनेम पासवर्ड के नामकरण सेवाओं में से एक द्वारा जाना जाता है, बस चलाएं:

getent passwd username

यह ओएस और कार्यान्वयन के आधार पर समूह, मेजबानों और अन्य लोगों के साथ भी काम करता है।


1
जबकि सोलारिस और लिनक्स, और हाल ही में अधिकांश बीएसडी में भी मैक ओएस एक्स पर getentनहीं हैgetent
बारबज

दरअसल, मुझे मैक ओएस / एक्स की याद आ रही है।
जुलियाग्रे

फिर भी यह सिस्टम पर काफी उपयोगी है जो इसका समर्थन करता है।
डैनियल बेक

1
getent अच्छा है क्योंकि आप कई उपयोगकर्ता नाम को क्वेरी कर सकते हैं जहाँ id केवल एक ही उपयोगकर्ता नाम का समर्थन करती है।
nall

6

finger

का आउटपुट पार्स करें finger -m <username>। कोई त्रुटि कोड नहीं अगर कोई उपयोगकर्ता नहीं मिला, दुर्भाग्य से, लेकिन अगर नहीं मिला, तो त्रुटि आउटपुट लिखा जाएगा। अब तक कोई कमियां नहीं हैं।

finger -ms <username> 2>&1 1>/dev/null | wc -l

0यदि उपयोगकर्ता नहीं मिला है, तो प्रिंट करेगा (क्योंकि कोई त्रुटि आउटपुट नहीं है), अन्यथा बड़ी संख्या।

chown

भागो (किसी भी उपयोगकर्ता के रूप में, आश्चर्यजनक रूप से):

T=$( mktemp -t foo.XXX ) ; chown <username> $T

यदि यह विफल रहता है root, तो खाता नाम अमान्य है।

यदि यह गैर- rootउपयोगकर्ता के रूप में विफल रहता है , तो ऑपरेशन के लिए संभवतः स्थानीयकृत आउटपुट को पार्स करें या अमान्य उपयोगकर्ता (या समकक्ष) नहीं। LANGइसे मज़बूती से करने के लिए पहले से सेट करें ।


0

मैं कहूंगा कि आप पर /etc/passwdऔर इसी तरह (जैसे /etc/shadowकि छाया आधारित प्रणालियों के लिए, ऑफ-टॉपिक साइड-नोट पर), कुछ इसी तरह की प्रणालियां /etc/master.passwdया अन्य ऐसी फाइलों का उपयोग कर सकती हैं ।

/etc/passwdआम तौर पर एक उपयोगकर्ता है या नहीं, इस पर पूर्ण आधिकारिक निर्णय के रूप में व्यवहार किया जाता है। यदि आप इस पृष्ठ पर वर्णित अन्य विधियों में से किसी का भी उपयोग करते हैं, और यदि वे अन्य विधियाँ किसी मौजूदा उपयोगकर्ता को इंगित /etc/passwdकरती हैं, लेकिन ऐसा नहीं है, तो मैं कहूंगा कि उपयोगकर्ता सिस्टम पर ठीक से मौजूद नहीं है, सबसे सामान्य मानक की परिभाषा से सॉफ्टवेयर की संभावना पर भरोसा होगा।

उस ने कहा, मैं कुछ अन्य विकल्पों के मिश्रण को जोड़ने के लिए दूसरे तरीके से फेंक दूंगा जिसका उपयोग किया जा सकता है।

ls -l /home | grep ^customUserName$<BR> echo $?

स्पष्ट रूप से, "customuserName" को उस उपयोगकर्ता के नाम से बदलें, जिसे आप चेक करना चाहते हैं। यदि आपके सिस्टम का उपयोग होता है, तो उसे / उपयोगकर्ताओं के साथ / घर बदलें। यह सभी उपयोगकर्ताओं को / etc / passwd में नहीं मिल सकता है यदि कोई विशेष निर्देशिका के लिए कोई गृह निर्देशिका नहीं बनाई गई थी, जो तब हो सकती है जब आप बस उपयोगकर्ताओं को आयात करते हैं (अर्थात, पाठ की पंक्तियाँ / etc / passwd में) और यदि गृह निर्देशिकाएँ नहीं हैं जब तक / जब तक कोई व्यक्ति लॉग इन नहीं करता है, तब तक तैयार रहें।


मुझे नहीं मिलता है कि आप ऐसे उपयोगकर्ता को क्यों बताते हैं जिनके पास / etc / पासवर्ड फ़ाइल में कोई प्रविष्टि नहीं है, लेकिन सिस्टम द्वारा "ठीक से" मौजूद होने idया getentनहीं होने की सूचना दी गई है, खासकर जब ओपी स्पष्ट रूप से नामकरण सेवाओं का उल्लेख कर रहे हैं सुविचारित करने के लिए।
जलीगरे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.