मैं सभी सुपर उपयोगकर्ताओं को कैसे सूचीबद्ध कर सकता हूं?


86

मैं उन सभी उपयोगकर्ताओं को सूचीबद्ध करने के लिए एक कमांड चाहता हूं जिनके पास रूट विशेषाधिकार हैं अर्थात sudo?

मान लीजिए मैं एक सुडोल उपयोगकर्ता हूँ। मैं अन्य सभी sudoer उपयोगकर्ताओं को कैसे जान सकता हूं?


यहाँ जवाब है: unix.stackexchange.com/a/140974/107084
AB

1
मुझे यह एक अच्छा unix.stackexchange.com/questions/50785/…
जोकर

@JoKeR अच्छा और मुश्किल
Maythux

1
ध्यान दें कि केवल जोकर और मुरु के उत्तर सही हैं, केवल पार्सिंग उपयोगकर्ता / समूह गोपनीय फाइलें आपको यह नहीं देती हैं कि किसके पास sudoअनुमति है और जिनके पास नहीं है .... यदि उपयोगकर्ता sudoसमूह में है, लेकिन sudoersफ़ाइल में sudoसमूह के लिए कुछ भी उल्लेख नहीं है । फिर?
heemayl

जवाबों:


81

यदि आपको केवल sudoसमूह में सूचीबद्ध सूडोर्स को सूचीबद्ध करने की आवश्यकता है , तो मुझे लगता है कि ऐसा करने का सबसे अच्छा तरीका इस कमांड को चलाना होगा (जो इस उत्तर में अन्य कमांडों की तुलना में कम्प्यूटेशनल रूप से हल्का होना चाहिए ):

grep -Po '^sudo.+:\K.*$' /etc/group

इसके अलावा muru द्वारा टिप्पणियों में सुझाए गए, प्रविष्टियों के प्रारूप को /etc/groupआसानी से नियंत्रित किया जा सकता है cut:

grep '^sudo:.*$' /etc/group | cut -d: -f4

इसके अलावा फिर से muru द्वारा टिप्पणी में सुझाव के रूप में, एक का उपयोग कर सकते हैं getentके स्थान पर grep:

getent group sudo | cut -d: -f4

इनमें से कोई भी आदेश sudoसमूह में सूचीबद्ध सभी उपयोगकर्ताओं /etc/group(यदि कोई हो) को प्रिंट करेगा ।

कमांड # 1 ब्रेकडाउन:

  • grep: एक फ़ाइल में एक regex से मेल खाते सभी लाइनों को प्रिंट करता है
  • -P: grepमैच पर्ल-स्टाइल रेगेक्स बनाता है
  • o: grepप्रिंट केवल मिलान किए गए स्ट्रिंग बनाता है
  • '^sudo.+:\K.*$': grepउद्धरणों के बीच रेगेक्स से मेल खाता है

रेगेक्स # 1 ब्रेकडाउन:

  • कोई भी वर्ण या वर्ण सूचीबद्ध नहीं है जो वर्ण या वर्णों के समूह से मेल खाता है
  • ^: लाइन की शुरुआत
  • .+: एक या एक से अधिक वर्ण
  • \K: पिछला मैच त्यागें
  • .*: शून्य या अधिक वर्ण
  • $: पंक्ति का अंत

कमांड # 2 ब्रेकडाउन:

  • grep: एक फ़ाइल में एक regex से मेल खाते सभी लाइनों को प्रिंट करता है
  • '^sudo.+:\K.*$': grepउद्धरणों के बीच रेगेक्स से मेल खाता है
  • cut: किसी फ़ाइल में प्रत्येक पंक्ति का केवल एक निर्दिष्ट अनुभाग प्रिंट करता है
  • -d:: क्षेत्र परिसीमन के रूप में cutव्याख्या :करता है
  • -f4: cutप्रिंट केवल चौथा क्षेत्र बनाता है

रेगेक्स # 2 ब्रेकडाउन:

  • कोई भी वर्ण या वर्ण सूचीबद्ध नहीं है जो वर्ण या वर्णों के समूह से मेल खाता है
  • ^: लाइन की शुरुआत
  • .*: शून्य या अधिक वर्ण
  • $: पंक्ति का अंत

5
-1: यह अन्य उपयोगकर्ताओं या समूहों को नहीं पकड़ेगा जो कि sudoers, या LDAP जैसे बाहरी स्रोतों में जोड़े गए हों, और लड़का यह ऐसा करने का एक बदसूरत तरीका है। getent group sudo | cut -d: -f4, या awk का उपयोग करें, लेकिन या तो यह याद रखें कि समूह और पासवार्ड के पास निश्चित प्रारूप हैं, जिसमें सीमांकक हैं।
मूरू

@muru आप सही, मैं अपने जवाब अद्यतन कर रहे हैं
कोस

@kos यह भी ध्यान दें कि आपको वास्तव में उपयोग करना चाहिए getent group- आपको grep की बिल्कुल भी आवश्यकता नहीं है। getent group fooपसंद है grep foo /etc/group, लेकिन अधिक सक्षम है।
मुरु

@ मुरु मुझे बिल्कुल भी नहीं पता था कि getentकोई भी कैसे grepऔर getentतुलनात्मक रूप से तुलना करता है? क्या इसे चलाना हल्का होगा getent?
कोस

1
यह उत्तर मानता है कि सभी sudoers sudoसमूह के सदस्य हैं । कुछ यूनिक्स में अन्य समूह हैं जैसे कि wheel। @Muru के जवाब में सभी sudoers शामिल होंगे चाहे वे किसी भी समूह में हों।
सिमोन वुडसाइड

30

जैसा कि यहां कहा गया है कि मैं एक साथ -l& -Uविकल्पों की खोज के लिए सबसे सरल तरीका मानता हूं , बस usersइसे टाइप करें जैसे कि उदाहरण: Johnतब

यदि उपयोगकर्ता के पास sudoपहुँच है, तो यह sudoउस विशेष उपयोगकर्ता के लिए पहुँच के स्तर को प्रिंट करेगा :

  sudo -l -U John
  User John may run the following commands on this host:
     (ALL : ALL) ALL

यदि उपयोगकर्ता के पास sudo एक्सेस नहीं है, तो यह प्रिंट करेगा कि उपयोगकर्ता को लोकलहोस्ट पर चलने की अनुमति नहीं हैsudo :

   sudo -l -U John
   User John is not allowed to run sudo on localhost.

2
आप सभी सामान्य उपयोगकर्ताओं के माध्यम से लूप सकता है और का उपयोग कर उन पर विवरण लौटने की तरह कुछ : for u in $(awk -F'[/:]' '{if($3>=1000&&$3!=65534) print $1}' /etc/passwd); do sudo -lU "$u" ; done। त्वरित हैक कुछ भी गारंटी नहीं है :)
विलफ

यह एक सक्रिय निर्देशिका सेटअप में भी काम करता है। उदाहरण के लिए, आप उपयोगकर्ता को कुछ विशेष समूह से चुन सकते हैं और उपयोगकर्ता पर जाँच कर सकते हैं। यदि आपने AD समूह को सही तरह से जोड़ा है "%domain admins@mycompany.intra" ALL=(ALL) ALLतो यह काम करता है। आपने मुझे बहुत समय बचाया, क्योंकि मैं गैर-स्थानीय उपयोगकर्ताओं के लिए भी इस काम से अनजान था।
एडमकालिस

14

जैसा कि पहले ही कहा जा चुका है, इसका उत्तर यूनिक्स और लिनक्स स्टैक एक्सचेंज में पाया जा सकता है :

इससे पता चलता है कि उपयोगकर्ता "saml" पहिया समूह का सदस्य है।

$ getent group wheel
wheel:x:10:saml

फर्क सिर्फ इतना है कि उबंटू में समूह नहीं है wheel, लेकिन sudo(या adminउबंटू के पुराने संस्करणों में)। तो कमांड बन जाता है:

getent group sudo

इन नंबरों का क्या मतलब है? मैंने किया geten groupऔर मुझे बहुत सारी संख्याएँ दिखाई दीं। मेरा मूल प्रश्न है, यह कैसे पता लगाया जाए कि कोई उपयोगकर्ता एक सिस्टम उपयोगकर्ता है (साथ बनाया गया है useradd -r)
Shayan

9

sudo -l -Uपरीक्षण पर विस्तार करना , कोई भी उन getent passwdउपयोगकर्ताओं को निर्धारित करने के लिए उपयोग कर सकता है जो उपयोग कर सकते हैं sudo। उपयोग getentकरने से हम उन उपयोगकर्ताओं तक पहुँच प्राप्त कर सकते हैं, जो passwdफ़ाइल में मौजूद नहीं हो सकते हैं , जैसे LDAP उपयोगकर्ता:

getent passwd | cut -f1 -d: | sudo xargs -L1 sudo -l -U | grep -v 'not allowed'

sudo -U एक गैर-शून्य निकास मान वापस नहीं करता है जिसका हम लाभ उठा सकते हैं, इसलिए हम आउटपुट को कम करने के लिए कम हो जाते हैं।


यह सबसे अच्छा जवाब है क्योंकि यह नहीं मानता है कि एक समूह कहा जाता है sudo
साइमन वुडसाइड

3

अधिकांश यूनिक्स जैसी प्रणालियों पर, जिसमें sudo कमांड है, और एक sudo कॉन्फ़िगरेशन फ़ाइल है; जड़ के रूप में चल रहा है:

:~$ sudo bash

या

:~$ su

:~# visudo

एक व्यवस्थापक को उन समूहों के विशेषाधिकारों का निरीक्षण और संशोधन करने की अनुमति देगा जो सुडो कमांड का उपयोग कर सकते हैं।

उबंटू की तरह डेबियन आधारित यूनिक्स जैसी प्रणालियों पर, समूह 4 और 27 में आम तौर पर सुडो विशेषाधिकार के अधिकार हैं।

समूह 4 प्रशासक समूह (प्रवेश) है और समूह 27 sudo gid है।

यह देखने के लिए कि वर्तमान में इन समूहों को कौन से उपयोगकर्ता सौंपे गए हैं, नीचे दिखाए गए अनुसार / etc / group फाइल को कैट करते हैं:

:~$ cat /etc/group

एक नमूना आउटपुट, उबंटू पर (लेकिन रेडहैट आधारित नहीं, ओरेकल सोलारिस / सोलारिस आधारित, या बीएसडी आधारित सिस्टम) इससे उपजेंगे:

adm:x:4:youruser
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9: 
uucp:x:10:
man:x:12:
proxy:x:13:
kmem:x:15:
dialout:x:20:
fax:x:21:
voice:x:22:
cdrom:x:24:youruser,mybrother
floppy:x:25:
tape:x:26:
sudo:x:27:youruser,mybrother

जैसा कि हम बता सकते हैं, youruser सिस्टम का प्रशासक है, और समूह 4 का सदस्य (प्रवेश) है। लेकिन आपका यसर और मैब्रोथर दोनों ही समूह 27 के सदस्य हैं, जो कि समूह सुडो की gid (समूह पहचान) संख्या है। तो mybrother रूट विशेषाधिकार (सुपर उपयोगकर्ता) भी प्राप्त कर सकता है।

फेडोरा और स्लैकवेयर जैसे कई लिनक्स सिस्टम, पहिया समूह gid = 10 को शामिल करते हैं। जब sudo कमांड लागू होने पर प्रशासक विशेषाधिकार देता है। बीएसडी आधारित प्रणालियों (उदाहरण के लिए फ्रीबीएसडी) पर, रूट उपयोगकर्ता पहिया समूह का एक सदस्य है जो कि जीआईडी ​​0 है।

आईडी कमांड का उपयोग करके भी कोई भी उपयोगकर्ता सिस्टम में किसी अन्य ज्ञात उपयोगकर्ता की समूह जानकारी पा सकता है।

उदाहरण के लिए:

:~$ id mybrother

नमूना उत्पादन

uid=1001(mybrother) gid=1001(mybrother) groups=1001(mybrother),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare)

मैंने विशेष रूप से आपको उभारने के लिए लॉग इन किया है। एकदम सही व्याख्या :)
विदर विस्ट्रम

1

यह आदेश sudo अधिकारों के साथ उपयोगकर्ताओं की सूची लौटाता है:

awk -F ":" '{ system("groups " $1 " | grep -P \"[[:space:]]sudo([[:space:]]|$)\"") }' /etc/passwd

आउटपुट है (उदाहरण के लिए):

<username> : <username> adm cdrom sudo dip plugdev lpadmin sambashare docker

यदि केवल उपयोगकर्ता नाम प्रदर्शित किया जाना है, तो यह कमांड:

awk -F ":" '{ system("groups " $1 " | grep -P \"[[:space:]]sudo([[:space:]]|$)\"") }' | awk -F ":" '{ print $1 }' /etc/passwd

1
यह sudoers की तुलना में अधिक उपयोगकर्ता दिखाता है। इसके लिए कुछ संशोधनों की जरूरत है
Maythux

@ नवासे बेहतर है?
AB

काफी बेहतर। जीडी काम
मेथॉक्स


0

मैं इस बारे में स्तब्ध था कि vagrantउपयोगकर्ता sudoबिना उल्लेख किए भी कैसे उपयोग कर सकता है /etc/sudoersऔर /etc/groupन ही इसके साथ पाया गया getent

बाहर sudoभी सभी फाइलों के तहत प्रविष्टियों को पढ़ता है/etc/sudoers.d/ । इसलिए यदि आपने उस निर्देशिका को नहीं देखा है, तो आपको एहसास नहीं हो सकता है कि वास्तव में कितने उपयोगकर्ताओं sudoतक पहुंच है।

sudoJoKeR के उपयोग से इस तरह की पहुंच का पता लगाया जा सकता है, sudo -l -U vagrantलेकिन यहां किसी भी अन्य उत्तर का पता नहीं लगाया गया है, जो सभी getentया तो भरोसा करते हैं /etc/group

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.