मैं लिनक्स में एक समूह के सभी सदस्यों (और संभवतः अन्य यूनियनों) को कैसे सूचीबद्ध करूं?
मैं लिनक्स में एक समूह के सभी सदस्यों (और संभवतः अन्य यूनियनों) को कैसे सूचीबद्ध करूं?
जवाबों:
दुर्भाग्य से, ऐसा करने के लिए कोई अच्छा, पोर्टेबल तरीका नहीं है जो मुझे पता है। यदि आप पार्स / आदि / समूह का प्रयास करते हैं, जैसा कि अन्य सुझाव दे रहे हैं, तो आप उन उपयोगकर्ताओं को याद करेंगे जिनके पास उस समूह को उनके प्राथमिक समूह के रूप में रखा गया है और कोई भी जो उस समूह में UNIX फ्लैट फ़ाइलों (यानी LDAP, NIS) के अलावा एक तंत्र के माध्यम से जोड़ा गया है, pam-pgsql, आदि)।
अगर मुझे पूरी तरह से खुद ऐसा करना है, तो शायद मैं इसे उल्टा id
करूंगा: सिस्टम पर प्रत्येक उपयोगकर्ता के समूह को प्राप्त करने के लिए उपयोग करें (जो एनएसएस को दिखाई देने वाले सभी स्रोतों को खींच लेगा), और हैश बनाए रखने के लिए पर्ल या कुछ समान का उपयोग करें प्रत्येक समूह के लिए तालिका ने उस उपयोगकर्ता की सदस्यता को देखा।
संपादित करें: बेशक, यह आपको एक समान समस्या के साथ छोड़ देता है: सिस्टम पर प्रत्येक उपयोगकर्ता की सूची कैसे प्राप्त करें। चूंकि मेरा स्थान केवल फ्लैट फ़ाइलों और LDAP का उपयोग करता है, मैं सिर्फ दोनों स्थानों से एक सूची प्राप्त कर सकता हूं, लेकिन यह आपके पर्यावरण के लिए सच हो सकता है या नहीं।
संपादन 2: किसी ने मुझे याद दिलाया कि getent passwd
सिस्टम पर सभी उपयोगकर्ताओं की सूची लौटाएगी, जिनमें LDAP /IS / etc शामिल हैं, लेकिन फिर getent group
भी अभी भी उन उपयोगकर्ताओं को याद करेंगे जो केवल डिफ़ॉल्ट समूह प्रविष्टि के माध्यम से सदस्य हैं, जिससे मुझे प्रेरणा मिली। यह त्वरित हैक लिखें।
#!/usr/bin/perl -T
#
# Lists members of all groups, or optionally just the group
# specified on the command line
#
# 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";
my $wantedgroup = shift;
my %groupmembers;
my $usertext = `getent passwd`;
my @users = $usertext =~ /^([a-zA-Z0-9_-]+):/gm;
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";
}
}
getent passwd
काम नहीं कर सकते हैं (यदि उदाहरण के लिए आप sssd का उपयोग कर रहे हैं)।
getent passwd
मैं इस बात पर विचार करूँगा कि sssd में बग है।
समूह के सदस्यों को सूचीबद्ध करने के लिए पायथन का उपयोग करें:
अजगर-सी "आयात जीआरपी; प्रिंट जीआरपी। प्रिंटग्रेन ('GROUP_NAME') [3]"
lid -g groupname | cut -f1 -d'('
निम्न आदेश संबंधित सभी उपयोगकर्ताओं को सूचीबद्ध करेगा <your_group_name>
, लेकिन केवल वे जो /etc/group
डेटाबेस द्वारा प्रबंधित होते हैं, एलडीएपी, एनआईएस, आदि नहीं। यह केवल द्वितीयक समूहों के लिए भी काम करता है , यह उन उपयोगकर्ताओं को सूचीबद्ध नहीं करेगा जिनके पास प्राथमिक समूह के बाद से समूह के रूप में सेट है। GID
फ़ाइल में (संख्यात्मक समूह आईडी) के रूप में संग्रहीत /etc/passwd
।
grep <your_group_name> /etc/group
निम्न आदेश संबंधित सभी उपयोगकर्ताओं को सूचीबद्ध करेगा <your_group_name>
, लेकिन केवल वे जो /etc/group
डेटाबेस द्वारा प्रबंधित होते हैं, एलडीएपी, एनआईएस, आदि नहीं। यह केवल द्वितीयक समूहों के लिए भी काम करता है , यह उन उपयोगकर्ताओं को सूचीबद्ध नहीं करेगा जिनके पास प्राथमिक समूह के बाद से समूह के रूप में सेट है। GID
फ़ाइल में (संख्यात्मक समूह आईडी) के रूप में संग्रहीत /etc/passwd
।
awk -F: '/^groupname/ {print $4;}' /etc/group
निम्नलिखित शेल स्क्रिप्ट सभी उपयोगकर्ताओं के माध्यम से दिखाई देगी और केवल उन उपयोगकर्ता नामों को प्रिंट करेगी जो किसी दिए गए समूह से संबंधित हैं:
#!/usr/bin/env bash
getent passwd | while IFS=: read name trash
do
groups $name 2>/dev/null | cut -f2 -d: | grep -i -q -w "$1" && echo $name
done
true
उपयोग उदाहरण:
./script 'DOMAIN+Group Name'
नोट: यह समाधान उपयोगकर्ताओं और समूहों (न केवल passwd
और group
फ़ाइलों) के लिए एनआईएस और एलडीएपी की जांच करेगा । यह उन उपयोगकर्ताओं को भी ध्यान में रखेगा, जिन्हें समूह में नहीं जोड़ा गया है, लेकिन समूह को प्राथमिक समूह के रूप में सेट किया गया है।
संपादित करें: दुर्लभ परिदृश्य के लिए जोड़ा गया फिक्स जहां उपयोगकर्ता एक ही नाम वाले समूह से संबंधित नहीं है।
संपादित करें: एक शेल स्क्रिप्ट के रूप में लिखा गया; @Max Chernyak उर्फ hakunin द्वारा सुझाए गए अनुसार स्थिति true
से बाहर निकलने के लिए जोड़ा गया ; कभी-कभार छोड़ देने के लिए छोड़ दिया गया ।0
stderr
groups: cannot find name for group ID xxxxxx
; true
। रिटर्निंग 0 आपके विन्यास प्रबंधन प्रणाली (बावर्ची, उत्तर देने योग्य, आदि) को टालने से बचने के लिए अच्छा है।
आप इसे एक ही कमांड लाइन में कर सकते हैं:
cut -d: -f1,4 /etc/passwd | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
ऊपर दिए गए आदेश में उन सभी उपयोगकर्ताओं को सूचीबद्ध किया गया है जो अपने प्राथमिक समूह के रूप में groupname रखते हैं
यदि आप भी groupname वाले उपयोगकर्ताओं को उनके द्वितीयक समूह के रूप में सूचीबद्ध करना चाहते हैं , तो निम्न कमांड का उपयोग करें
getent group <groupname> | cut -d: -f4 | tr ',' '\n'
grep
एक उपयोगकर्ता से मेल खाएगा जिसके नाम में समूह संख्या होती है (जैसे समूह के sc0tt
भाग के रूप में दिखाया जाएगा root
)। यदि यह एक समस्या है, तो रेगेक्स का उपयोग करें :$(getent group <groupname> | cut -d: -f3)\$
(अर्धविराम, समूह आईडी और पंक्ति के अंत से मेल खाता है)। (रेगेक्स में उद्धरण न जोड़ें, और न ही शिकायत करें।)
जेड के कार्यान्वयन को संभवतः कुछ अन्य प्रमुख यूनिक्स पर काम करने के लिए विस्तारित किया जाना चाहिए।
किसी के पास Solaris या HP-UX हार्डवेयर है ;; उन मामलों का परीक्षण नहीं किया।
#!/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";
}
}
यदि इस सुझाव को साझा करने का कोई बेहतर तरीका है, तो कृपया मुझे बताएं; मैंने कई तरीकों पर विचार किया, और यही वह है जिसके साथ मैं आया था।
id -Gn
करने के बाद सोलारिस 10 पर काम करने की पुष्टि की/usr/xpg4/bin/id -G -n
मैंने ऊपर दिए गए पर्ल कोड के समान ही किया है, लेकिन मूल पर्ल फ़ंक्शन के साथ गेटेंट और आईडी को बदल दिया है। यह बहुत तेज़ है और अलग-अलग * निक्स फ्लेवर में काम करना चाहिए।
#!/usr/bin/env perl
use strict;
my $arg=shift;
my %groupMembers; # defining outside of function so that hash is only built once for multiple function calls
sub expandGroupMembers{
my $groupQuery=shift;
unless (%groupMembers){
while (my($name,$pass,$uid,$gid,$quota,$comment,$gcos,$dir,$shell,$expire)=getpwent()) {
my $primaryGroup=getgrgid($gid);
$groupMembers{$primaryGroup}->{$name}=1;
}
while (my($gname,$gpasswd,$gid,$members)=getgrent()) {
foreach my $member (split / /, $members){
$groupMembers{$gname}->{$member}=1;
}
}
}
my $membersConcat=join(",",sort keys %{$groupMembers{$groupQuery}});
return "$membersConcat" || "$groupQuery Does have any members";
}
print &expandGroupMembers($arg)."\n";
एक आसान डेबियन और उबंटू पैकेज है जिसे ' सदस्य ' कहा जाता है जो इस कार्यक्षमता को प्रदान करता है:
विवरण: एक समूह के सदस्यों को दर्शाता है; डिफ़ॉल्ट रूप से, सभी सदस्यों के सदस्य समूहों के पूरक होते हैं: जबकि समूह उन समूहों को दिखाते हैं जो एक निर्दिष्ट उपयोगकर्ता से संबंधित हैं, सदस्य एक निर्दिष्ट समूह से संबंधित उपयोगकर्ताओं को दिखाते हैं।
... आप प्राथमिक सदस्यों, माध्यमिक सदस्यों, दोनों को एक पंक्ति में, प्रत्येक को अलग-अलग पंक्तियों के लिए कह सकते हैं।
getent group insert_group_name_here | awk -F ':' '{print $4}' | sed 's|,| |g'
यह उन उपयोगकर्ताओं की एक अंतरिक्ष से अलग सूची देता है, जिनका उपयोग मैंने स्क्रिप्ट में सरणियों को आबाद करने के लिए किया है।
for i in $(getent group ftp | awk -F ':' '{print $4}' | sed 's|,| |g')
do
userarray+=("$i")
done
या
userarray+=("$(getent group GROUPNAME | awk -F ':' '{print $4}' | sed 's|,| |g')")
यहाँ एक स्क्रिप्ट है जो / etc / passwd और / etc / समूह के उपयोगकर्ताओं की सूची लौटाता है जो इसे NIS या LDAP की जाँच नहीं करता है, लेकिन यह उन उपयोगकर्ताओं को दिखाता है जिनके समूह में उनका डिफ़ॉल्ट समूह डेबियन 4.7 और सोलारिस 9 पर परीक्षण किया गया है
#!/bin/bash
MYGROUP="user"
# get the group ID
MYGID=`grep $MYGROUP /etc/group | cut -d ":" -f3`
if [[ $MYGID != "" ]]
then
# get a newline-separated list of users from /etc/group
MYUSERS=`grep $MYGROUP /etc/group | cut -d ":" -f4| tr "," "\n"`
# add a newline
MYUSERS=$MYUSERS$'\n'
# add the users whose default group is MYGROUP from /etc/passwod
MYUSERS=$MYUSERS`cat /etc/passwd |grep $MYGID | cut -d ":" -f1`
#print the result as a newline-separated list with no duplicates (ready to pass into a bash FOR loop)
printf '%s\n' $MYUSERS | sort | uniq
fi
या एक-लाइनर के रूप में आप यहां से सीधे कट और पेस्ट कर सकते हैं (पहले चर में समूह का नाम बदल सकते हैं)
MYGROUP="user";MYGID=`grep $MYGROUP /etc/group | cut -d ":" -f3`;printf '%s\n' `grep $MYGROUP /etc/group | cut -d ":" -f4| tr "," "\n"`$'\n'`cat /etc/passwd |grep $MYGID | cut -d ":" -f1` | sort | uniq
UNIX में (GNU / Linux के विपरीत), सूची सूची कमांड है। सूचियों के लिए सोलारिस मैन पेज देखें ।
ध्यान दें कि यह कमांड ओपन-सोर्स हीरलूम प्रोजेक्ट का हिस्सा है । मुझे लगता है कि यह GNU / Linux से गायब है क्योंकि RMS समूहों और अनुमतियों में विश्वास नहीं करता है। :-)
NAME listusers - print a list of user logins SYNOPSIS listusers [-g groups] [-l logins] DESCRIPTION Listusers prints the name and the gecos information of all users known to the system, sorted by username. Valid options are: -g groups Only print the names of users that belong to the given group. Multiple groups are accepted if separated by commas. -l logins Print only user names that match logins. Multiple user names are accepted if separated by commas.
यहाँ एक बहुत ही सरल awk स्क्रिप्ट है जो अन्य उत्तरों में सूचीबद्ध सभी सामान्य नुकसानों को ध्यान में रखती है:
getent passwd | awk -F: -v group_name="wheel" '
BEGIN {
"getent group " group_name | getline groupline;
if (!groupline) exit 1;
split(groupline, groupdef, ":");
guid = groupdef[3];
split(groupdef[4], users, ",");
for (k in users) print users[k]
}
$4 == guid {print $1}'
मैं अपने ldap- सक्षम सेटअप के साथ इसका उपयोग कर रहा हूं, कुछ मानकों पर चलता है, जो मानकों के अनुरूप है और awk, जिसमें Solaris 8+ और hpux शामिल हैं।
getent group groupname | awk -F: '{print $4}' | tr , '\n'
इसके 3 भाग हैं:
1 - getent group groupname
"/ etc / group" फ़ाइल में समूह की लाइन दिखाता है। के लिए वैकल्पिक cat /etc/group | grep groupname
।
2 - awk
एक ही पंक्ति में ',' के साथ अलग-अलग सदस्यों को प्रिंट करें।
3 - tr
एक नई पंक्ति के साथ 'की जगह', और प्रत्येक उपयोगकर्ता को एक पंक्ति में प्रिंट करें।
4 - वैकल्पिक: sort
यदि उपयोगकर्ता बहुत अधिक हैं, तो आप दूसरे पाइप का भी उपयोग कर सकते हैं।
सादर
मुझे लगता है कि सबसे आसान तरीका निम्नलिखित कदम है, आपको किसी भी पैकेज या सॉफ्टवेयर को स्थापित करने की आवश्यकता नहीं होगी:
सबसे पहले, आप समूह के GID का पता लगाते हैं जिसे आप उपयोगकर्ताओं को जानना चाहते हैं, इसके लिए बहुत सारे तरीके हैं: बिल्ली / आदि / समूह (अंतिम स्तंभ GID है) आईडी उपयोगकर्ता (उपयोगकर्ता वह है जो किसी से संबंधित है समूह)
अब आप फ़ाइल / etc / passwd पर सभी उपयोगकर्ता को सूचीबद्ध करेंगे, लेकिन आप पिछले समूह के सदस्यों को प्राप्त करने के लिए कमांड के निम्नलिखित सीक्वल के साथ कुछ फ़िल्टर लागू करेंगे।
कट -d: -f1,4 / etc / passwd | grep GID (GID वह संख्या है जो आपको चरण 1 से मिली थी)
कट कमांड फ़ाइल के कुछ "कॉलम" का चयन करेगा, पैरामीटर d को सीमांकित करता है ":" इस मामले में, पैरामीटर -f "फ़ील्ड" (या कॉलम) का चयन करता है जिसे आउट केस में 1 और 4 दिखाया जाना है (पर) फ़ाइल / etc / passwd, 1 / कॉलम उपयोगकर्ता का नाम है और 4 etc उस समूह का GID है जो उपयोगकर्ता का है), को अंतिम रूप देने के लिए। - grep GID सिर्फ समूह को फ़िल्टर करेगा (4% कॉलम पर) चुना था।
यहां एक और पायथन वन-लाइनर है जो उपयोगकर्ता की डिफ़ॉल्ट समूह सदस्यता ( /etc/passwd
) के साथ-साथ समूह डेटाबेस ( /etc/group
) से भी खाता है।
python -c "import grp,pwd; print set(grp.getgrnam('mysupercoolgroup')[3]).union([u[0] for u in pwd.getpwall() if u.pw_gid == grp.getgrnam('mysupercoolgroup')[2]])"
मैंने कोशिश की है grep 'sample-group-name' /etc/group
, जो आपके द्वारा निर्दिष्ट समूह के सभी सदस्यों को यहां उदाहरण के आधार पर सूचीबद्ध करेगा
/etc/group
कम से कम 3 अन्य उत्तरों में पहले से ही है, आपका उत्तर उनके लिए किस मूल्य को जोड़ता है? इसके अलावा, उन सभी अन्य उत्तरों में टिप्पणियां हैं कि इस तरह के समाधान केवल माध्यमिक समूहों के लिए काम करते हैं और LDAP, NIS, आदि द्वारा प्रबंधित खाते के लिए भी काम नहीं करते हैं