सभी मानव उपयोगकर्ताओं की सूची बनाएं


19

मैं उन सभी मानव उपयोगकर्ताओं को कैसे सूचीबद्ध कर सकता हूं जिन्हें मैंने बनाया है? मैंने कोशिश की है cat /etc/passwdऔर यह सिर्फ बहुत सारी चीजें सूचीबद्ध करता है।

जवाबों:


18

मानव उपयोगकर्ताओं के पास 1000 से शुरू होने वाले यूआईडी हैं, इसलिए आप गैर-मनुष्यों को छानने के लिए उस तथ्य का उपयोग कर सकते हैं:

cut -d: -f1,3 /etc/passwd | egrep ':[0-9]{4}$' | cut -d: -f1

यह पहले (उपयोगकर्ता नाम) और तीसरे (यूआईडी) कॉलोन-सीमांकित क्षेत्रों को /etc/passwdकाटता है, फिर परिणामी लाइनों के लिए फ़िल्टर करता है जो एक कोलोन और चार अंकों के साथ समाप्त होता है, फिर उसमें से पहला (उपयोगकर्ता नाम) फ़ील्ड काट देता है, जो आपको एक सूची के साथ छोड़ देता है 1000 और 9999 के बीच यूआईडी वाले उपयोगकर्ता।

यदि आपके सिस्टम पर नौ हज़ार से अधिक उपयोगकर्ता हैं, तो यह विफल हो जाएगा - लेकिन परिणाम को 4-अंकीय nobodyयूआईडी में प्रतिबंधित करना आवश्यक है ताकि आप उसे पकड़ न सकें (UID 65534)।


15

यह बहुत ज्यादा करता है कि स्वीकृत उत्तर क्या करता है, सिर्फ तीन के बजाय एक कमांड में:

awk -F: '$3 >= 1000 && $1 != "nobody" {print $1}' /etc/passwd

और टिप्पणियों में कैरेल के लिए धन्यवाद, nobodyउपयोगकर्ता को भी फ़िल्टर किया गया है।


@ कारेल हाँ, हो सकता है। UID द्वारा फ़िल्टर करने के बजाय, मैं स्पष्ट रूप से उस उपयोगकर्ता नाम को फ़िल्टर कर रहा हूं। UID के साथ वैध उपयोगकर्ता होने का एक कारण हो सकता है कि उच्च ... कौन जानता है?)
Oli

8

मैं व्यक्तिगत रूप से सिर्फ उपयोग करना चाहता हूं:

ls /home

बेशक यह उपयोगकर्ताओं की सूची नहीं है, बल्कि उनके घर निर्देशिकाओं की सूची है। वर्तमान में सिस्टम पर मौजूदा मानव उपयोगकर्ताओं के पास घर निर्देशिकाएं होंगी /home, लेकिन आप पिछले उपयोगकर्ताओं के घर निर्देशिकाओं को देख सकते हैं जिन्हें हटा दिया गया था, साथ ही साथ।

यह मेरे उद्देश्यों के लिए काम करता है और आपके लिए भी काम कर सकता है। उदाहरण के लिए, यदि आप उस उपयोगकर्ता खाते को हटाना चाहते हैं जो अब मौजूद नहीं है ( nonexistent-user) और कमांड को चलाता है

sudo deluser nonexistent-user

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


+1 यह तरीका सरल है, यह वही है जो सबसे अनुभवी उपयोगकर्ता वास्तव में करेंगे, और मुझे लगता है कि यह उन तरीकों से कम मजबूत नहीं है जो यूआईडी की एक सीमा की जांच करते हैं। ऐसा लगता है कि मानव उपयोगकर्ता के पास एक घरेलू निर्देशिका होने की संभावना कम है /home(जो कि सहानुभूति नहीं है /home) की तुलना में एक मानव उपयोगकर्ता के पास 1000 से कम का यूआईडी होगा (आखिरकार, यह प्रदर्शन प्रबंधक को लिस्टिंग से रखने का सबसे आम तरीका है लॉगिन स्क्रीन पर एक उपयोगकर्ता, जो कभी-कभी एक मानव उपयोगकर्ता के लिए किया जा सकता है)। एक, अपेक्षाकृत छोटा नुकसान यह है कि lost+foundअलग-अलग /homeविभाजन वाले सिस्टम पर सूचीबद्ध किया जाएगा ।
एलिया कगन

छोटी समस्या, हालांकि: यदि उपयोगकर्ता के साथ बनाया गया था तो क्या होगा useradd --no-create-home username?
सर्गी कोलोडियाज़नी

@ मुझे लगता है कि यह समस्या वर्णन में निहित अस्पष्टता के लिए नीचे आता है। क्या कोई होम निर्देशिका वाला खाता वास्तव में एक मानव उपयोगकर्ता का प्रतिनिधित्व करता है? व्यवहार में, इस तरह के खाते आमतौर पर होते हैं - हालांकि आमतौर पर हमेशा नहीं - अत्यधिक विशिष्ट कार्यों के लिए उपयोग किया जाता है (आमतौर पर अपने स्वयं के अलग-अलग खातों वाले लोग) या केवल विशिष्ट, प्रतिबंधित सेवाओं के माध्यम से सिस्टम तक पहुंचने के लिए उपयोगकर्ताओं के लिए। बेशक useradd --no-create-home- इसके लिए एक और उपयोग का मामला है - होम निर्देशिका पहले से ही मौजूद हो सकती है या इसके तुरंत बाद बनाई जा सकती है - लेकिन ls /homeविधि उन मामलों के लिए ठीक काम करती है।
एलियाह कगन

4

हालांकि यह एक स्पष्ट विचार की तरह लग सकता है, वास्तव में मानव उपयोगकर्ता के अर्थ में अस्पष्टता है । क्या उपयोगकर्ता खाता जानबूझकर लॉगिन स्क्रीन से छिपा हुआ है क्योंकि इसका उपयोग केवल विशेष उद्देश्यों (लेकिन मनुष्यों द्वारा) एक मानव उपयोगकर्ता के लिए किया जाता है? ubuntuलाइव सीडी पर उपयोगकर्ता (यूआईडी 999) के बारे में कैसे ? और उबंटू में अतिथि खाते लॉग-आउट के बाद ऑन-द-फ्लाई और नष्ट हो जाते हैं; क्या वे मानव उपयोगकर्ता हैं? अधिक उदाहरण तैयार किए जा सकते हैं।

इसलिए, यह उचित है कि एकाधिक, गैर-समकक्ष उत्तर दिए गए हैं। Saige हैम्ब्लिन को चलाने का समाधानls /home वही है जो लोग वास्तव में करते हैं, और जब तक आप एक स्क्रिप्ट नहीं लिख रहे हैं, तब तक आपको शायद इसका उपयोग करना चाहिए।

ls /homeअधिक रोब बनाना

लेकिन शायद आपके पास ऐसे उपयोगकर्ता हैं जिन्हें हटा दिया गया है, लेकिन जिनके घर निर्देशिका अभी भी मौजूद हैं /home, और आपको उन्हें सूचीबद्ध करने से बचना चाहिए। या हो सकता है कि किसी अन्य कारण से आपको यह सुनिश्चित करना होगा /homeकि वास्तविक खातों के अनुरूप केवल प्रविष्टियां ही सूचीबद्ध हैं।

उस मामले में, मैं सब कुछ के नाम में गुजर का सुझाव देते हैं /homeकरने के लिए getent(पुनः प्राप्त करने के passwdउन नामों के साथ उपयोगकर्ताओं की प्रविष्टियों), तो अलग करने और प्रदर्शन सिर्फ उपयोगकर्ता नाम क्षेत्र (साथ grep, sedया awkअपनी पसंद के अनुसार,)। इनमें से कोई एक करेगा:

getent passwd $(ls /home) | grep -o '^[^:]*'
getent passwd $(ls /home) | sed 's/:.*//'
getent passwd $(ls /home) | awk -F: '{print $1}'

यह अच्छी तरह से काम करना चाहिए, क्योंकि आपके पास व्हाट्सएप के साथ उपयोगकर्ता खाते नहीं होने चाहिए या उनके नामों में वर्णों को नियंत्रित करना चाहिए; इसकी अनुमति के बिना उबंटू को फिर से संगठित किए बिना नहीं किया जा सकता है ; और यदि आप करते हैं, तो आपको बड़ी समस्याएं हैं। इस प्रकार पार्सिंग के साथ हमेशा की तरह समस्याओं lsकर रहे हैं अयोग्य। लेकिन यहां तक ​​कि यह वास्तव में यहाँ ठीक है, अगर आप lsसौंदर्य से नाराजगी या सिर्फ एक बुरी आदत के साथ कमांड प्रतिस्थापन पर विचार करते हैं, तो आप निम्न कर सकते हैं:

getent passwd $(basename -a /home/*) | grep -o '^[^:]*'
getent passwd $(basename -a /home/*) | sed 's/:.*//'
getent passwd $(basename -a /home/*) | awk -F: '{print $1}'

ये व्हाट्सएप को नियंत्रित नहीं करते हैं या वर्णों को नियंत्रित नहीं करते हैं। मैं उन्हें केवल इसलिए प्रदान करता हूं क्योंकि $(ls /home)यह सही होने पर भी गलत दिखता है, और इस तरह कई उपयोगकर्ताओं को गलत तरीके से रगड़ता है। ज्यादातर स्थितियों में, पार्सिंग से बचने के लिए वास्तविक, अच्छे कारण हैंls , और उन स्थितियों में पार्सिंग basename -aआमतौर पर बहुत कम खराब है। इस स्थिति में, हालांकि, उपयोगकर्ता नाम में व्यावहारिक रूप से क्या अक्षर हो सकते हैं , इस सीमा के कारण , वे दोनों ठीक हैं।

स्पष्टीकरण, लाभ और कमियां

मैं getentमुख्य रूप से उपयोग करता हूं क्योंकि यह उपयोगकर्ता नाम को अपने आउटपुट को प्रतिबंधित करने के लिए तर्क के रूप में स्वीकार करता है, लेकिन यह भी क्योंकि यह /etc/passwdसीधे प्रमाणीकरण की तुलना में थोड़ा अधिक सार्वभौमिक है , प्रमाणीकरण सुविधाओं और पासवर्ड डेटाबेस नेटवर्क सेवाओं द्वारा प्रदान किए जाते हैं।

इस पद्धति का अतिरिक्त लाभ है ls /homeकि, सिस्टम पर एक अलग /homeविभाजन के साथ, lost+foundआमतौर पर आउटपुट में दिखाई देता है ls /home

  • ऊपर प्रस्तुत अधिक मजबूत विधि के साथ, lost+foundकेवल तभी प्रकट होगा जब कोई उपयोगकर्ता (मानव या नहीं) कहा जाता है lost+found, जो कि संभावना नहीं है।
  • लेकिन अगर आप स्क्रिप्ट लिखने के बजाय अंतःक्रियात्मक रूप से कमांड दर्ज कर रहे हैं, तो ls /homeयह ठीक है - आप जानते हैं कि आपके पास एक मानव उपयोगकर्ता नहीं है जिसे कहा जाता है lost+found

आमतौर पर, यह विधि (उपरोक्त में से किसी में भी भिन्नता) असंतोषजनक आउटपुट उत्पन्न करेगी:

  • यदि किसी उपयोगकर्ता की होम निर्देशिका बाहर मौजूद है /home, या बिल्कुल भी नहीं है, तो यह सुझाव देता है लेकिन इसका अर्थ यह नहीं है कि खाते को मानव उपयोगकर्ता का प्रतिनिधित्व करने के लिए नहीं माना जाना चाहिए। यह विधि केवल तब उपयोगकर्ताओं को सूचीबद्ध करती है जब उसी नाम का एक निर्देशिका होता है /home
  • यदि आपने अतिरिक्त निर्देशिकाएं बनाई /homeहैं , जो वास्तव में किसी की घर निर्देशिका नहीं हैं, और उनका नाम एक मौजूदा गैर-मानव उपयोगकर्ता के समान है - या व्हाट्सएप द्वारा अलग किए गए शब्दों से मिलकर बना है, जिनमें से एक या एक से अधिक नाम हैं मौजूदा गैर-मानव उपयोगकर्ता के रूप में - फिर कुछ गैर-मानव उपयोगकर्ताओं को आउटपुट में शामिल किया जा सकता है।
    (यह विधि एक लूप और अलग-अलग getentइनवोकेशन के साथ लागू की जा सकती है , इसलिए शब्द विभाजन अलग-अलग आउटपुट का उत्पादन नहीं करता है। लेकिन जटिलता को वारंट नहीं किया जाता है; मूल रूप से, यदि आप /homeउपयोगकर्ताओं के होम निर्देशिका के लिए एक जगह के अलावा किसी अन्य चीज के रूप में उपयोग करते हैं, तो यह विधि है। विश्वसनीय उत्पादन नहीं।)

यूआईडी चेकिंग को सरल बनाना

यदि आप एक विधि के साथ जाने का निर्णय लेते हैं जो उपयोगकर्ता आईडी की जांच करता है ताकि यह सुनिश्चित किया जा सके कि वे मनुष्यों का प्रतिनिधित्व करने वाले खातों के लिए संभावित सीमा में हैं, जैसा कि स्वीकृत उत्तर या ओली के उत्तर में है , तो मैं संक्षिप्तता के लिए यह सुझाव देता हूं:

getent passwd | grep -oP '^[^:]+(?=:x:\d{4}:)'

यह दिखाने के लिए एक पर्ल रेगुलर एक्सप्रेशन ( -P) का उपयोग करता है :

  • पंक्ति की शुरुआत में पाठ ( ^जिसमें कोई नहीं है ) :( [^:]+) - यह पहला क्षेत्र है, जैसा :कि क्षेत्र विभाजक में हैpasswd
  • उस पूर्ववर्ती शब्द (?= )में पासवर्ड क्षेत्र शामिल नहीं है (लेकिन xयह हमेशा होना चाहिए x, क्योंकि उबंटू पासवर्ड हैश shadowडेटाबेस में संग्रहीत किया जाता है, विश्व-पठनीय passwdडेटाबेस नहीं
  • और एक यूआईडी क्षेत्र जिसमें 4 अंक ( :\d{4}:) शामिल हैं।

इस प्रकार स्वीकृत उत्तर में तकनीक का काफी छोटा और कुछ हद तक सरल संस्करण है । (वहां वर्णित तकनीक ठीक भी काम करती है, और इसका गैर-जीएनयू / लिनक्स सिस्टम के पोर्टेबल होने का लाभ है जिसका grepसमर्थन नहीं करता है -P।)

"मानव" यूआईडी रेंज पर पुनर्विचार

यदि आप बहुत अधिक यूआईडी को समायोजित करना चाहते हैं और nobodyस्पष्ट रूप से जांचना चाहते हैं, तो आप ओली के उत्तर में विधि का उपयोग कर सकते हैं । आप विचार करना चाह सकते हैं, हालांकि, यदि बहुत अधिक यूआईडी वाले उपयोगकर्ताओं को वास्तव में मानव माना जाना चाहिए, या यदि वे कुछ अन्य विशेष उद्देश्य वाले गैर-मानव उपयोगकर्ता (जैसे nobody) होने की अधिक संभावना रखते हैं । व्यवहार में ऐसे उपयोगकर्ता - इसके अलावा - nobodyअसामान्य नहीं है, इसलिए वास्तव में यह आपकी ओर से एक निर्णय कॉल है।

यूआईडी की श्रेणी में उपयोगकर्ताओं को सूचीबद्ध करने के लिए एक संभावित समझौता है जो वास्तव में नए बनाए गए, गैर-"सिस्टम" उपयोगकर्ताओं को सौंपा जा रहा है। आप इस के लिए जाँच कर सकते हैं मेंadduser.conf :

$ grep -E '^(FIRST|LAST)_UID' /etc/adduser.conf
FIRST_UID=1000
LAST_UID=29999

यहां उन उपयोगकर्ताओं को सूचीबद्ध करने के दो तरीके दिए गए हैं, जिनकी यूआईडी 1000 से 29999 तक होती है:

getent passwd | grep -oP '^[^:]+(?=:x:[12]?\d{4}:)'
getent passwd | awk -F: '999<$3 && $3<30000 {print $1}'

यदि आप स्टाइलिस्टिक रूप से प्रसन्न होना चाहते हैं, basenameतो बदसूरत है। यह इससे बेहतर नहीं है ls। सिद्धांत कारण है कि हम ls को पार्स नहीं करते हैं, यह एक ऐसा काम है जो अन्य साधनों द्वारा बहुत अधिक सुरक्षित और साफ-सुथरे ढंग से किया जा सकता है, शैली से नहीं । इस मामले में, शेल cd /home; getent passwd *:।
मुरु

मैं आपके साथ / घर से अविश्वसनीय होने पर सहमत हूं (यह मेरे लिए बेकार है, मेरा जवाब देखें)। मैं सिर्फ यह कह रहा हूं कि यदि आप शैली के बारे में प्रचार करने जा रहे हैं, तो नाइटपैकिंग की अपेक्षा करें।
मुरु

@ मैं देखती हूं कि मेरी मूल कथावस्तु लोगों को गुमराह करने से कैसे रोक सकती lsहै। "असंतोषजनक आउटपुट" के बारे में 2 गोली बिंदु ने इस मुद्दे को कवर किया, लेकिन यह बाद के अनुभाग में दिखाई देता है। मैंने स्पष्ट किया है कि इस स्थिति में पार्स lsकरना उचित क्यों है । हालांकि cd /home; getent passwd *एक ले प्रपत्र अक्सर एक जंगली सूअर का बच्चा दृष्टिकोण का संकेत है, मैं यह इतनी के रूप में पाठकों का नेतृत्व करने के लिए नहीं की सामग्री को विश्वास करने से परहेज किया है /homeवास्तविक उपयोगकर्ताओं के लिए इसी नहीं अजीब जोड़ा प्रविष्टियों के साथ निर्देशिका,, अभी भी किसी भी तरह के लिए एक गाइड के रूप में पर भरोसा किया जा सकता है क्या उपयोगकर्ता मौजूद हैं।
एलिया कगन

1

TL; DR : केवल मानव उपयोगकर्ताओं के पास SystemAccount = false है

रूट की अनदेखी करते हुए आउटपुट को सूचीबद्ध करने का एक अन्य तरीका है ls /var/lib/AccountsService/users/ | grep -v root। अब, एक क्विकर - जीडीएम, एक अभिवादक / लॉगिन स्क्रीन (या अधिक औपचारिक रूप से डेस्कटॉप प्रबंधक) भी एक उपयोगकर्ता के रूप में सूचीबद्ध है। इसलिए लिस्टिंग से बस हम यह बता सकते हैं कि जीडीएम मानव है या नहीं।

एक अधिक कुशल और सही तरीका उस फ़ोल्डर में फ़ाइलों के माध्यम से जाना और यह पता लगाना है कि कौन से उपयोगकर्ता सूचीबद्ध हैं SystemAccount=false। वन-लाइनर बलो को प्राप्त होता है

grep SystemAccount=false /var/lib/AccountsService/users/* | awk -F '/' '{gsub(":","/");print $6}'


1
हालांकि कभी-कभी काम करते हैं, यह कुछ अपेक्षाकृत सामान्य परिदृश्यों में विफल रहता है। उदाहरण के लिए, मेरे उबंटू 15.04 न्यूनतम सिस्टम पर ( mini.isoबिना डिस्प्ले मैनेजर या एक्स 11 स्थापित किए), मेरे पास एक मानव उपयोगकर्ता खाता है - फिर /var/lib/AccountsService/usersभी एक खाली निर्देशिका है। मुझे उम्मीद है कि यह इसी तरह से आउट-ऑफ-द-बॉक्स उबंटू सर्वर इंस्टॉलेशन पर काम नहीं करेगा। इसके अलावा, जब यह काम करता है, तो यह कुछ हद तक एक प्रतिबंधात्मक धारणा के तहत ऐसा करता है जो एक उपयोगकर्ता खाते को "मानव" बनाता है: एक उपयोगकर्ता को useradd, जिसके बिना भी --system, एक फ़ाइल नहीं बनाता है AccountsService/users
एलिया कगन

1

पार्टी में शामिल होकर, मैं LDAP का उपयोग कर एक नेटवर्क सिस्टम की देखरेख करता हूं, /homeलाखों में घर की निर्देशिका और UIDs (एक स्क्रिप्टिंग गड़बड़ के कारण)। वर्तमान जवाबों में से कोई भी, इसलिए, काम करते हैं। परीक्षण जो मेरे लिए काम करता है, यह जाँच रहा है कि क्या उपयोगकर्ता के पास एक वैध लॉगिन शेल है। एक वैध शेल वह है जिसे सूचीबद्ध किया गया है /etc/shells। सबसे सरल रूप:

getent passwd | grep -wFf /etc/shells

फ़ाइल में टिप्पणियां (या खाली लाइनें) हो सकती हैं, इसलिए किसी को उन्हें फ़िल्टर करना पड़ सकता है:

getent passwd | grep -wFf <(grep '^/' /etc/shells)

+1 यह अब तक का सबसे मजबूत दृष्टिकोण हो सकता है। हालाँकि, इसे दिखाने का नुकसान है root(जिसे शायद एक मानव उपयोगकर्ता नहीं माना जाना चाहिए, क्योंकि मनुष्य आमतौर पर अस्थायी और विशिष्ट उद्देश्यों के लिए, अपने नियमित काम के लिए उपयोग करने के बजाय) बन जाता है, ऐसा लगता है कि यह विफल होने की संभावना कम से कम है कोई भी प्रमुख तरीका। (मेरा सहित) अन्य उत्तर में तरीकों, विफल हो सकता है पद्धति के आधार पर, अगर घर निर्देशिका में नहीं हैं /home, अन्य कचरा है में /home, UID अजीब हैं, या प्रणाली एक डीएम का उपयोग नहीं करता। यह उत्तर उन सभी परिदृश्यों में बहुत अच्छा काम करता है।
एलिया कगन

1

बंटू सिस्टम पर, नियमित उपयोगकर्ता (मानव उपयोगकर्ता, जो) यूआईडी हैं, जिनकी शुरुआत 1000 से होती है, जो क्रमिक रूप से उन्हें सौंपे जाते हैं, जब उनके खाते पहली बार बनते हैं। यह सब उबलता है कि बंटू प्रणाली पर बनाए गए पहले खाते में 1000 का यूआईडी है। अगले बनाए गए 1001 का यूआईडी है। और इसी तरह आगे भी।

इसलिए, सिस्टम पर मौजूद सभी मानव उपयोगकर्ता खातों को सूचीबद्ध करने का सबसे सरल तरीका, मेरी राय में, यह जांचना है कि क्या /etc/passwdफ़ाइल में तीसरा स्तंभ जिसमें उपयोगकर्ता का यूआईडी 1000 या उससे अधिक है या उससे कम है, चलो कहते हैं, 2000 (यह एक विशिष्ट डेस्कटॉप पीसी के लिए एक हजार से अधिक उपयोगकर्ता खातों के लिए बहुत संभावना नहीं है, क्या आपको ऐसा नहीं लगता?)

$ awk -F$':' '{ if ($3 >= 1000 && $3 < 2000) print $1; }' /etc/passwd

विवरण के साथ ओली के उत्तर को समझाने के लिए धन्यवाद। आपको फ़िल्टर करने की भी आवश्यकता है nobody। =)
अनातोली टेकटोनिक

1
आपके पास नहीं है क्योंकि किसी के पास 65534 का यूआईडी नहीं है और इस तरह से अन्य सभी गैर-उपयोगकर्ता खातों के रूप में स्वचालित रूप से फ़िल्टर किया गया है।
मिशा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.