मैं उन सभी मानव उपयोगकर्ताओं को कैसे सूचीबद्ध कर सकता हूं जिन्हें मैंने बनाया है? मैंने कोशिश की है cat /etc/passwd
और यह सिर्फ बहुत सारी चीजें सूचीबद्ध करता है।
मैं उन सभी मानव उपयोगकर्ताओं को कैसे सूचीबद्ध कर सकता हूं जिन्हें मैंने बनाया है? मैंने कोशिश की है cat /etc/passwd
और यह सिर्फ बहुत सारी चीजें सूचीबद्ध करता है।
जवाबों:
मानव उपयोगकर्ताओं के पास 1000 से शुरू होने वाले यूआईडी हैं, इसलिए आप गैर-मनुष्यों को छानने के लिए उस तथ्य का उपयोग कर सकते हैं:
cut -d: -f1,3 /etc/passwd | egrep ':[0-9]{4}$' | cut -d: -f1
यह पहले (उपयोगकर्ता नाम) और तीसरे (यूआईडी) कॉलोन-सीमांकित क्षेत्रों को /etc/passwd
काटता है, फिर परिणामी लाइनों के लिए फ़िल्टर करता है जो एक कोलोन और चार अंकों के साथ समाप्त होता है, फिर उसमें से पहला (उपयोगकर्ता नाम) फ़ील्ड काट देता है, जो आपको एक सूची के साथ छोड़ देता है 1000 और 9999 के बीच यूआईडी वाले उपयोगकर्ता।
यदि आपके सिस्टम पर नौ हज़ार से अधिक उपयोगकर्ता हैं, तो यह विफल हो जाएगा - लेकिन परिणाम को 4-अंकीय nobody
यूआईडी में प्रतिबंधित करना आवश्यक है ताकि आप उसे पकड़ न सकें (UID 65534)।
यह बहुत ज्यादा करता है कि स्वीकृत उत्तर क्या करता है, सिर्फ तीन के बजाय एक कमांड में:
awk -F: '$3 >= 1000 && $1 != "nobody" {print $1}' /etc/passwd
और टिप्पणियों में कैरेल के लिए धन्यवाद, nobody
उपयोगकर्ता को भी फ़िल्टर किया गया है।
मैं व्यक्तिगत रूप से सिर्फ उपयोग करना चाहता हूं:
ls /home
बेशक यह उपयोगकर्ताओं की सूची नहीं है, बल्कि उनके घर निर्देशिकाओं की सूची है। वर्तमान में सिस्टम पर मौजूदा मानव उपयोगकर्ताओं के पास घर निर्देशिकाएं होंगी /home
, लेकिन आप पिछले उपयोगकर्ताओं के घर निर्देशिकाओं को देख सकते हैं जिन्हें हटा दिया गया था, साथ ही साथ।
यह मेरे उद्देश्यों के लिए काम करता है और आपके लिए भी काम कर सकता है। उदाहरण के लिए, यदि आप उस उपयोगकर्ता खाते को हटाना चाहते हैं जो अब मौजूद नहीं है ( nonexistent-user
) और कमांड को चलाता है
sudo deluser nonexistent-user
यह आपको केवल यह बताएगा कि यह उपयोगकर्ता मौजूद नहीं है।
/home
(जो कि सहानुभूति नहीं है /home
) की तुलना में एक मानव उपयोगकर्ता के पास 1000 से कम का यूआईडी होगा (आखिरकार, यह प्रदर्शन प्रबंधक को लिस्टिंग से रखने का सबसे आम तरीका है लॉगिन स्क्रीन पर एक उपयोगकर्ता, जो कभी-कभी एक मानव उपयोगकर्ता के लिए किया जा सकता है)। एक, अपेक्षाकृत छोटा नुकसान यह है कि lost+found
अलग-अलग /home
विभाजन वाले सिस्टम पर सूचीबद्ध किया जाएगा ।
useradd --no-create-home username
?
useradd --no-create-home
- इसके लिए एक और उपयोग का मामला है - होम निर्देशिका पहले से ही मौजूद हो सकती है या इसके तुरंत बाद बनाई जा सकती है - लेकिन ls /home
विधि उन मामलों के लिए ठीक काम करती है।
हालांकि यह एक स्पष्ट विचार की तरह लग सकता है, वास्तव में मानव उपयोगकर्ता के अर्थ में अस्पष्टता है । क्या उपयोगकर्ता खाता जानबूझकर लॉगिन स्क्रीन से छिपा हुआ है क्योंकि इसका उपयोग केवल विशेष उद्देश्यों (लेकिन मनुष्यों द्वारा) एक मानव उपयोगकर्ता के लिए किया जाता है? 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
डेटाबेस नहीं:\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
वास्तविक उपयोगकर्ताओं के लिए इसी नहीं अजीब जोड़ा प्रविष्टियों के साथ निर्देशिका,, अभी भी किसी भी तरह के लिए एक गाइड के रूप में पर भरोसा किया जा सकता है क्या उपयोगकर्ता मौजूद हैं।
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}'
mini.iso
बिना डिस्प्ले मैनेजर या एक्स 11 स्थापित किए), मेरे पास एक मानव उपयोगकर्ता खाता है - फिर /var/lib/AccountsService/users
भी एक खाली निर्देशिका है। मुझे उम्मीद है कि यह इसी तरह से आउट-ऑफ-द-बॉक्स उबंटू सर्वर इंस्टॉलेशन पर काम नहीं करेगा। इसके अलावा, जब यह काम करता है, तो यह कुछ हद तक एक प्रतिबंधात्मक धारणा के तहत ऐसा करता है जो एक उपयोगकर्ता खाते को "मानव" बनाता है: एक उपयोगकर्ता को useradd
, जिसके बिना भी --system
, एक फ़ाइल नहीं बनाता है AccountsService/users
।
पार्टी में शामिल होकर, मैं LDAP का उपयोग कर एक नेटवर्क सिस्टम की देखरेख करता हूं, /home
लाखों में घर की निर्देशिका और UIDs (एक स्क्रिप्टिंग गड़बड़ के कारण)। वर्तमान जवाबों में से कोई भी, इसलिए, काम करते हैं। परीक्षण जो मेरे लिए काम करता है, यह जाँच रहा है कि क्या उपयोगकर्ता के पास एक वैध लॉगिन शेल है। एक वैध शेल वह है जिसे सूचीबद्ध किया गया है /etc/shells
। सबसे सरल रूप:
getent passwd | grep -wFf /etc/shells
फ़ाइल में टिप्पणियां (या खाली लाइनें) हो सकती हैं, इसलिए किसी को उन्हें फ़िल्टर करना पड़ सकता है:
getent passwd | grep -wFf <(grep '^/' /etc/shells)
root
(जिसे शायद एक मानव उपयोगकर्ता नहीं माना जाना चाहिए, क्योंकि मनुष्य आमतौर पर अस्थायी और विशिष्ट उद्देश्यों के लिए, अपने नियमित काम के लिए उपयोग करने के बजाय) बन जाता है, ऐसा लगता है कि यह विफल होने की संभावना कम से कम है कोई भी प्रमुख तरीका। (मेरा सहित) अन्य उत्तर में तरीकों, विफल हो सकता है पद्धति के आधार पर, अगर घर निर्देशिका में नहीं हैं /home
, अन्य कचरा है में /home
, UID अजीब हैं, या प्रणाली एक डीएम का उपयोग नहीं करता। यह उत्तर उन सभी परिदृश्यों में बहुत अच्छा काम करता है।
बंटू सिस्टम पर, नियमित उपयोगकर्ता (मानव उपयोगकर्ता, जो) यूआईडी हैं, जिनकी शुरुआत 1000 से होती है, जो क्रमिक रूप से उन्हें सौंपे जाते हैं, जब उनके खाते पहली बार बनते हैं। यह सब उबलता है कि बंटू प्रणाली पर बनाए गए पहले खाते में 1000 का यूआईडी है। अगले बनाए गए 1001 का यूआईडी है। और इसी तरह आगे भी।
इसलिए, सिस्टम पर मौजूद सभी मानव उपयोगकर्ता खातों को सूचीबद्ध करने का सबसे सरल तरीका, मेरी राय में, यह जांचना है कि क्या /etc/passwd
फ़ाइल में तीसरा स्तंभ जिसमें उपयोगकर्ता का यूआईडी 1000 या उससे अधिक है या उससे कम है, चलो कहते हैं, 2000 (यह एक विशिष्ट डेस्कटॉप पीसी के लिए एक हजार से अधिक उपयोगकर्ता खातों के लिए बहुत संभावना नहीं है, क्या आपको ऐसा नहीं लगता?)
$ awk -F$':' '{ if ($3 >= 1000 && $3 < 2000) print $1; }' /etc/passwd
nobody
। =)