एक समूह के सभी सदस्यों की सूची (मैक ओएस एक्स)


56

मैंने Googling की कोशिश की है, लेकिन कहीं भी नहीं मिल रहा है। मैं ओएस एक्स में कमांड-लाइनmygroup से बुलाए गए समूह के सभी सदस्यों को कैसे सूचीबद्ध कर सकता हूं ?

$ dscl . list /groupsमुझे सभी समूह मिलेंगे ... लेकिन मैं प्रत्येक समूह के सदस्यों को कैसे देख सकता हूं?

जवाबों:


40

आप उपयोग कर सकते हैं:

dscacheutil -q group -a name admin

या:

dscacheutil -q group -a name staff

आदि।


यह मेरी पसंदीदा विधि है। आसान मटर, और सटीक। धन्यवाद!
TryTryAgain

यह एक शानदार उत्तर है क्योंकि 90% उपयोग के मामलों को इसके साथ हल किया जा सकता है न कि अधिक विस्तृत लिपियों के साथ जिन्हें उत्तर के रूप में पोस्ट किया गया है।
जेकॉल्ड

बस इसे अपने शेल स्टार्टअप फ़ाइल में एक उपनाम के रूप में जोड़ें और आप इसे एक-शब्द कमांड प्लस समूह नाम बना सकते हैं।
नील मुनरो

जब मैंने "dscacheutil -q group" की कोशिश की, तो मुझे "एडमिन" के लिए 2 पैराग्राफ मिल गए। दोनों का एक ही नाम, gid है, लेकिन अलग-अलग उपयोगकर्ताओं की सूची है। कोई उपाय? धन्यवाद!
गोल्डन थम्ब

जरूरी नहीं कि पूरा हो। dscacheutil -q group -a name adminकेवल मुझे 1 परिणाम दिया, जबकि स्वीकृत उत्तरदाता की शेल स्क्रिप्ट ने मुझे 2 परिणाम दिए।
समझदार

64

कोई मानक कमांड नहीं है जो ओएस एक्स में एक समूह के सभी सदस्यों को सूचीबद्ध करता है, इसलिए यहां एक शेल फ़ंक्शन है जो ऐसा करता है:

members () { dscl . -list /Users | while read user; do printf "$user "; dsmemberutil checkmembership -U "$user" -G "$*"; done | grep "is a member" | cut -d " " -f 1; }; 

उपरोक्त कमांड-लाइन को टर्मिनल पर कॉपी करें, और फिर टाइप करें (जहां मायग्रुप एक मौजूदा समूह का नाम है)।members mygroup


रुचि रखने वालों के लिए कुछ स्पष्टीकरण:

कर रहे हैं पाँच अलग अलग तरीकों से (है कि मैं के बारे में पता) एक उपयोगकर्ता ओएस एक्स में एक समूह के सदस्य आदेश हो सकता है कि उत्पादन के लिए की, यहां तक कि किसी भी सभी इसकी गारंटी नहीं है, या mygroup के सदस्यों, क्योंकि सदस्यता भी उपयोगकर्ताओं से आता है ' प्राथमिक समूह आईडी , उपयोगकर्ता की यूयूआईडी द्वारा सदस्यता, एक समूह से दूसरे में सदस्यता की विरासत, और सिस्टम द्वारा गणना की जाने वाली सदस्यता, जैसे समूह हर कोईdscl . -read /Groups/mygroup GroupMembership

इसलिए उन सभी पर नज़र रखने की कोशिश करने के बजाय, सिस्टम पर प्रत्येक उपयोगकर्ता की सदस्यता ( dsmemberutil का उपयोग करके ) की जांच करना एक बेहतर विचार की तरह लगता है , और यही शेल फ़ंक्शन और नीचे दी गई स्क्रिप्ट है।


यह सदस्य स्क्रिप्ट शेल फ़ंक्शन के बराबर है, लेकिन इसमें अमान्य इनपुट के अच्छे हैंडलिंग हैं:

#!/bin/bash

# members -- list all members of a group
#
# SYNOPSIS
#   members groupname
#
# http://superuser.com/questions/279891/list-all-members-of-a-group-mac-os-x
#  by Arne
# Expected to work on Mac OS 10.5 and newer, tested on 10.6 and 10.7.
# It could be rewritten to work on 10.4 by using "dseditgroup -o checkmember"
# instead of "dsmemberutil checkmembership".
# By using dseditgroup, the script could also be extended to handle
# other Directory Service nodes than the default local node.
#

the_group="$1"
# Input check and usage
  if [[ $# != 1 || $1 == -* || $1 =~ [[:space:]] ]]; then
    echo "Usage: ${0##*/} groupname" >&2
    echo "Lists all members of the group." >&2
    exit 64
  elif (dsmemberutil checkmembership -U root -G "$the_group" 2>&1 \
    | grep "group .* cannot be found") >&2; then
    exit 1
  fi

# Check every user
exec dscl . -list /Users \
  | while read each_username
  do
    printf "$each_username "
    dsmemberutil checkmembership -U "$each_username" -G "$the_group"
  done \
    | grep "is a member" | cut -d " " -f 1

# eof

अनुपूरक जानकारी:

समूह के सदस्य होने के पाँच तरीके हैं:

  1. उपयोगकर्ता का प्राथमिक समूह
  2. समूह के ग्रुप मेम्बरशिप में सूचीबद्ध
  3. UUID समूह के में सूचीबद्ध GroupMembers
  4. समूह Y का एक सदस्य होने के कारण समूह X की सदस्यता प्राप्त की गई जो समूह X के NestedGroups में सूचीबद्ध है
  5. प्रणाली द्वारा गणना की गई सदस्यता

इनको कमांड जैसे के साथ एक्सप्लोर किया जा सकता है dscl . -read /Groups/somegroup

4 का उदाहरण : प्रिंट ऑपरेटर समूह की सदस्यता __lpoperator_ को प्रिंट व्यवस्थापक समूह __lpadmin_ के सदस्यों द्वारा विरासत में मिली है, और उस समूह की सदस्यता व्यवस्थापक समूह के सदस्यों को विरासत में मिली है ।

5 का उदाहरण :

$ dscl . -read /Groups/netaccounts Comment
Comment:
 Group membership calculated by system
 Accounts from a remote directory server
$ 

यह भी देखें
    आईडी (1) , DSCL (1) , dsmemberutil (1) , dseditgroup (8) , DirectoryServiceAttributes (7) , UUID (3)


7
इस तरह की ख़ासियतें हैं जो मुझे ध्यान में आती हैं जब मैं लोगों को बताता हूं कि जबकि OS X सतह पर ज्यादातर सुंदर है, तो इसमें कवर के नीचे छिपा हुआ कुछ गंदा सामान मिला है।
स्टीफन श्मिट

+1 : यह ठोस रूप से काम करता है। धन्यवाद।
स्लिप डी। थॉम्पसन

यह वह जानकारी है जो मुझे पता करने की आवश्यकता है कि व्यवस्थापक समूह से खुद को कैसे निकालना है। उपयोगकर्ता नाम से हटाने की बारी पर्याप्त नहीं है, आपको UUID को निकालने की भी आवश्यकता है, github.com/drduh/macOS-Security-and-Privacy-Guide/issues/…
Jens Timurerman

10

नोट: यह मेरा प्रारंभिक उत्तर था, इससे पहले कि मुझे एहसास हुआ कि यह उत्तर अभी भी अधूरा परिणाम देता है । (उदाहरण के लिए, यह सभी समूह के सदस्यों को नहीं पाता है !) इसलिए मैंने एक बेहतर उत्तर लिखा , जिसमें एक स्क्रिप्ट शामिल है जो ओएस एक्स में एक समूह के सभी सदस्यों को सूचीबद्ध करती है


mygroup के GroupMembership संपत्ति के साथ मुद्रित किया जा सकता DSCL इस तरह:

dscl . -read /Groups/mygroup GroupMembership

लेकिन यह समूह के सदस्यों के सभी (या यहां तक ​​कि) आउटपुट के लिए गारंटी नहीं है। क्या गायब हैं वे उपयोगकर्ता जो केवल अपने प्राथमिक समूह आईडी के रूप में समूह के सदस्य हैं ।

OS X में इसका एक सामान्य उदाहरण नियमित लॉगिन खाते हैं, जिनमें कर्मचारी (समूह 20) उनके प्राथमिक समूह के रूप में हैं, लेकिन कर्मचारी समूह के GroupMembership संपत्ति में सूचीबद्ध नहीं हैं ।

उन उपयोगकर्ताओं को संख्यात्मक प्राथमिक समूह ID (gid) के लिए खोजा जा सकता है जैसे कि कर्मचारी समूह के लिए उदाहरण (gid 20):

dscl . -list /Users PrimaryGroupID | grep " 20$"

और संख्यात्मक gid (PrimaryGroupID) की mygroup से पाया जाता है:

dscl . -read /Groups/mygroup PrimaryGroupID

7

एक उपयोगकर्ता के सभी समूह प्राप्त करने के लिए , आप निम्नलिखित का उपयोग कर सकते हैं:

id -nG <username>

उदाहरण आउटपुट:

staff com.apple.sharepoint.group.1 everyone localaccounts _appserverusr admin _appserveradm _lpadmin _appstore _lpoperator _developer com.apple.access_ftp com.apple.access_screensharing com.apple.access_ssh

ऊपर दिए गए आदेश का उपयोग करते हुए, उन सभी उपयोगकर्ताओं को प्राप्त करना संभव है जो किसी समूह के हैं :

OSX :

group=staff;
for i in $(dscl . list /users);
do [[ $(id -nG $i | grep $group) ]] && echo $i;
done

यूनिक्स :

group=sudo;
# This only outputs lines that match a username (from the start of line to a colon must not be a hash indicating a comment) 
for i in $(grep -oE "^[^#:]+" /etc/passwd);
do [[ $(id -nG $i | grep $group) ]] && echo $i;
done

यह उन समूहों की सूची प्राप्त करने के लिए एक अच्छा टिप है जो एक उपयोगकर्ता के हैं। लेकिन यह विपरीत है कि ओपी क्या पूछ रहा था, जो उन उपयोगकर्ताओं की सूची है जो एक समूह से संबंधित हैं।
समझदार

@wisbucky यह वही है जो मैं था। मैं यहां "उपयोगकर्ता के सभी समूहों की सूची" ढूंढ रहा हूं। मैं इसे स्पष्ट करने के लिए एक संपादन का सुझाव दूंगा
आइज़ैक

4

dscl . -read /Groups/[groupname] | grep GroupMembership

BE AWARE: ऊपर दिए गए आदेश में हमेशा सभी समूह सदस्यों की पूरी सूची प्रदर्शित नहीं होती है। जैसे समूह "स्टाफ" के लिए आपको केवल एक समूह सदस्य के रूप में "रूट" मिलता है जो अधूरा है। यह जाँच करने के लिए कि एक डिफ़ॉल्ट उपयोगकर्ता ("रूट" नहीं) के रूप में निम्न कमांड में से एक का उपयोग करें: id -GnORgroups

परिणामस्वरूप आप सभी समूहों को देखेंगे कि आपका डिफ़ॉल्ट लॉग इन उपयोगकर्ता का सदस्य है। उनमें से एक "कर्मचारी" होना चाहिए। इस प्रकार, "रूट" के अलावा समूह "स्टाफ" के अधिक सदस्य हैं, जो कमांड द्वारा सूचीबद्ध नहीं हैं dscl . -read /Groups/[groupname] | grep GroupMembership। वही कमांड के लिए जाता है dscacheutil -q group -a name staffजो आपको यह भी बताता है कि केवल "रूट" समूह "स्टाफ" का एक सदस्य है, जो स्पष्ट रूप से अपूर्ण है।

OSX पर टर्मिनल में एक समूह के सभी सदस्यों को वास्तव में प्राप्त करने के लिए एकमात्र विश्वसनीय तरीका पहले से ही यहाँ Arne Stenström द्वारा प्रदान किया गया है। यह उनके शेल फ़ंक्शन सम्मान का उपयोग कर रहा है। उसकी शेल स्क्रिप्ट। दोनों महान काम करता है!


1

आदेश

@ Duperuser के उत्तर के समान, निम्नलिखित केवल समूह के उपयोगकर्ताओं को adminबीच में रिक्त स्थान के साथ प्रिंट करेगा :

dscacheutil -q group -a name admin | grep -e '^users:' | sed 's/users: //'

उत्पादन

उपरोक्त कमांड चलाने से कुछ इस तरह का उत्पादन होगा:

root your_username someone_else

टूट - फूट

dscacheutilआदेश सिस्टम के निर्देशिका सेवा कैश की विभिन्न श्रेणियों के बारे में जानकारी क्वेरी करने के लिए प्रयोग किया जाता है। -qविकल्प श्रेणी मिलने क्वेरी करना चाहते हैं निर्दिष्ट कर सकते हैं। उपलब्ध श्रेणियां समूह, होस्ट, माउंट, प्रोटोकॉल, आरपीसी, सेवा और उपयोगकर्ता हैं। हम -aविकल्प के साथ एक प्रमुख मूल्य युग्म निर्दिष्ट करके उस श्रेणी को आगे क्वेरी करते हैं । इस मामले में, हम उस समूह को सूचीबद्ध करना चाहते हैं nameजिसमें मूल्य के बराबर कुंजी है admindscacheutilआदेश के ऊपर इस प्रकार उत्पादन का उत्पादन:

name: admin
password: *
gid: 80
users: root yourusername

इसके बाद हम इस टेक्स्ट को पाइप करते हैं grepऔर users:शुरुआत में स्ट्रिंग वाले लाइन को बाहर निकालते हैं । -eविकल्प ग्रेप पहचान बनाता है नियमित अभिव्यक्ति^चरित्र बताता है कि हम चाहते हैं users:पंक्ति के आरंभ में किया जाना है।

यह हमें देता है

users: root yourusername

अंत में, हम इसे सेड में पास करते हैं और टेक्स्ट users:को खाली स्ट्रिंग से बदल देते हैं। में एसईडी , पहले अक्षर sसे प्रतिस्थापित करने का मतलब है। स्लैश की पहली जोड़ी ( /users: /) के बीच का पाठ वह है जिसे हम बदलना चाहते हैं, और स्लैश की अगली जोड़ी ( //) वह है जिसे हम स्थानापन्न करना चाहते हैं (इस मामले में, कुछ भी नहीं)।


0

यहाँ इस समस्या के लिए एक कार्यान्वयन है जो एक संबंधित चर्चा में कार्यान्वयन से लिया गया था । दिनचर्या कुछ सामान्य है, किसी विशिष्ट मंच / वास्तुकला के लिए डायरेक्ट्री सर्विस लुकिंग हुक के साथ, इसलिए इसका उपयोग विषम नेटवर्क पर संशोधन के बिना किया जा सकता है। हमने इस उपयोगिता नाम से एक प्रतीकात्मक लिंक स्थापित किया है । इस कार्यान्वयन के लिए अन्य मूल का उल्लेख स्क्रिप्ट के रोपण अनुभाग में किया गया है। इस उपकरण को कम से कम OSX, HP-UX, linux और SunOS पर चलाने का इरादा है, लेकिन ऐसा नहीं किया गया हैzedSunOS और HP-UX पर परीक्षण किया गया। उबंटू लिनक्स 12.04 और मावेरिक्स OSX 10.9.1 पर स्क्रिप्ट का यथासंभव परीक्षण किया गया। इस स्क्रिप्ट का आउटपुट इस समस्या के लिए पहले शेल स्क्रिप्ट कार्यान्वयन के लिए आउटपुट से मेल खाता है, और इसलिए इसे सही माना जाता है।

#!/usr/bin/perl
#
# Lists members of all groups, or optionally just the group
# specified on the command line
#
# Date:         12/30/2013
# Author:       William H. McCloskey, Jr.
# Changes:      Added logic to detect host type & tailor subset of getent (OSX)
# Attribution:
#   The logic for this script was directly lifted from Zed Pobre's work.
#     See below for Copyright notice.
#   The idea to use dscl to emulate a subset of the now defunct getent on OSX
#     came from
#       http://zzamboni.org/\
#         brt/2008/01/21/how-to-emulate-unix-getent-with-macosxs-dscl/
#     with an example implementation lifted from
#       https://github.com/petere/getent-osx/blob/master/getent
#
# Copyright © 2010-2013 by Zed Pobre (zed@debian.org or zed@resonant.org)
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#

use strict; use warnings;

$ENV{"PATH"} = "/usr/bin:/bin";

# Only run on supported $os:
my $os;
($os)=(`uname -a` =~ /^([\w-]+)/);
unless ($os =~ /(HU-UX|SunOS|Linux|Darwin)/)
    {die "\$getent or equiv. does not exist:  Cannot run on $os\n";}

my $wantedgroup = shift;

my %groupmembers;

my @users;

# Acquire the list of @users based on what is available on this OS:
if ($os =~ /(SunOS|Linux|HP-UX)/) {
    #HP-UX & Solaris assumed to be like Linux; they have not been tested.
    my $usertext = `getent passwd`;
    @users = $usertext =~ /^([a-zA-Z0-9_-]+):/gm;
};
if ($os =~ /Darwin/) {
    @users = `dscl . -ls /Users`;
    chop @users;
}

# Now just do what Zed did - thanks Zed.
foreach my $userid (@users)
{
    my $usergrouptext = `id -Gn $userid`;
    my @grouplist = split(' ',$usergrouptext);

    foreach my $group (@grouplist)
    {
        $groupmembers{$group}->{$userid} = 1;
    }
}

if($wantedgroup)
{
    print_group_members($wantedgroup);
}
else
{
    foreach my $group (sort keys %groupmembers)
    {
        print "Group ",$group," has the following members:\n";
        print_group_members($group);
        print "\n";
    }
}

sub print_group_members
{
    my ($group) = @_;
    return unless $group;

    foreach my $member (sort keys %{$groupmembers{$group}})
    {
        print $member,"\n";
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.