আমি কীভাবে লিনাক্সের একটি গোষ্ঠীর সমস্ত সদস্যকে তালিকাবদ্ধ করব (এবং সম্ভবত অন্যান্য ইউনিট)?
আমি কীভাবে লিনাক্সের একটি গোষ্ঠীর সমস্ত সদস্যকে তালিকাবদ্ধ করব (এবং সম্ভবত অন্যান্য ইউনিট)?
উত্তর:
দুর্ভাগ্যক্রমে, আমি জানি যে এটি করার কোনও ভাল, পোর্টেবল উপায় নেই। যদি আপনি / ইত্যাদি / গোষ্ঠীটি পার্স করার চেষ্টা করেন, যেমন অন্যরা পরামর্শ দিচ্ছেন, আপনি যে ব্যবহারকারীদের সেই প্রাথমিক গ্রুপ হিসাবে রয়েছেন এবং ইউএনআইএক্স ফ্ল্যাট ফাইলগুলি (যেমন এলডিএপি, এনআইএস, প্যাম-পিএসএসকিএল ইত্যাদি)।
যদি আমাকে নিজেই এটি করতে হয় তবে আমি সম্ভবত এটি বিপরীতে করব: id
সিস্টেমে প্রতিটি ব্যবহারকারীর গোষ্ঠী পেতে (যা এনএসএসের কাছে দৃশ্যমান সমস্ত উত্সকে টানবে) ব্যবহার করতে, এবং পার্স বা হ্যাশ বজায় রাখতে অনুরূপ কিছু ব্যবহার করবে প্রতিটি দলের জন্য টেবিলটি ব্যবহারকারীর সদস্যতার বিষয়টি লক্ষ্য করে আবিষ্কার করেছে।
সম্পাদনা: অবশ্যই, এটি আপনাকে একই ধরণের সমস্যার সাথে ছেড়ে দেয়: সিস্টেমে প্রতিটি ব্যবহারকারীর তালিকা কীভাবে পাবেন। যেহেতু আমার অবস্থানটিতে কেবল ফ্ল্যাট ফাইল এবং এলডিএপি ব্যবহার করা হয়েছে, তাই আমি উভয় অবস্থান থেকে কেবল একটি তালিকা পেতে পারি, তবে এটি আপনার পরিবেশের জন্য সত্য বা নাও হতে পারে।
সম্পাদনা 2: পাস করার সময় কেউ আমাকে স্মরণ করিয়ে দিয়েছিল যে getent passwd
এটি এলডিএপি / এনআইএস / ইত্যাদি সহ সিস্টেমের সমস্ত ব্যবহারকারীর একটি তালিকা ফিরিয়ে দেবে, তবে 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
না যাতে কাজ নাও করা যায় (উদাহরণস্বরূপ আপনি এসএসডি ব্যবহার করছেন)।
getent passwd
আমি এসএসডি-তে থাকা একটি বাগটি বিবেচনা করব।
গ্রুপ মেম্বারদের তালিকা করতে পাইথন ব্যবহার করুন:
পাইথন-সি "আমদানি জিআরপি; প্রিন্ট করুন grp.getgrnam ('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
ফাইলগুলি নয়) এনআইএস এবং এলডিএপি পরীক্ষা করবে । এটি ব্যবহারকারীদের কোনও গোষ্ঠীতে যোগ করা হয়নি তবে গ্রুপটিকে প্রাথমিক গোষ্ঠী হিসাবে সেট করা অ্যাকাউন্টগুলিতেও নেবে।
সম্পাদনা করুন: বিরল দৃশ্যের জন্য যুক্ত করা ফিক্স যেখানে ব্যবহারকারী একই নামের গোষ্ঠীভুক্ত নয়।
সম্পাদনা: শেল স্ক্রিপ্ট আকারে লিখিত; @ ম্যাক্স চের্নিয়াক ওরফে হাকুনিনের পরামর্শ অনুসারে স্থিতি true
দিয়ে প্রস্থান করতে যোগ করা হয়েছে ; সেই ঘটনাগুলি এড়িয়ে যেতে বাতিল করা হয়েছে ।0
stderr
groups: cannot find name for group ID xxxxxx
; true
। আপনার কনফিগারেশন ম্যানেজমেন্ট সিস্টেমের (শেফ, উত্তরযোগ্য, ইত্যাদি) ট্রিপ আপ এড়াতে 0 ফেরত দেওয়া ভাল good
আপনি এটি একটি একক কমান্ড লাইনে করতে পারেন:
cut -d: -f1,4 /etc/passwd | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
উপরের কমান্ডে সমস্ত ব্যবহারকারীকে তাদের প্রাথমিক গোষ্ঠী হিসাবে গ্রুপের নাম তালিকাভুক্ত করা হয়েছে
আপনার কাছে থাকার ব্যবহারকারীর তালিকাকে করতে চান GROUPNAME তাদের মাধ্যমিক দল হিসেবে নিম্নলিখিত কমান্ড প্রয়োগ করুন
getent group <groupname> | cut -d: -f4 | tr ',' '\n'
grep
এমন কোনও ব্যবহারকারীর সাথে মিলবে যার নামটিতে গ্রুপ নম্বর রয়েছে (যেমন গোষ্ঠীর sc0tt
অংশ হিসাবে প্রদর্শিত হবে root
)। যদি এটি কোনও সমস্যা হয় তবে রেজেক্স ব্যবহার করুন :$(getent group <groupname> | cut -d: -f3)\$
(সেমিকোলন, গ্রুপ আইডি এবং লাইনের শেষের সাথে মেলে)। (রেজেক্সে উদ্ধৃতি বা বাশের অভিযোগ যুক্ত করবেন না ins)
জেডের বাস্তবায়ন সম্ভবত অন্য কয়েকটি বড় ইউএনআইএক্স-তে কাজ করার জন্য প্রসারিত করা উচিত।
কারও সোলারিস বা এইচপি-ইউএক্স হার্ডওয়্যার অ্যাক্সেস আছে ?; এই মামলাগুলি পরীক্ষা করেনি।
#!/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
থেকে/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 / গ্রুপের ব্যবহারকারীদের একটি তালিকা দেয় যা এটি এনআইএস বা এলডিএপি চেক করে না, তবে এটি এমন ব্যবহারকারীদের দেখায় যাঁরা এই গ্রুপটি তাদের ডিফল্ট গ্রুপ হিসাবে ডিবিয়ান ৪.7 এবং সোলারিস ris তে পরীক্ষা করেছেন
#!/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
ইউনিক্সে (জিএনইউ / লিনাক্সের বিপরীতে) তালিকাভুক্তকারী কমান্ড রয়েছে। তালিকার জন্য সোলারিস ম্যান পৃষ্ঠাটি দেখুন ।
নোট করুন যে এই কমান্ডটি মুক্ত-উত্স হেরলুম প্রকল্পের অংশ । আমি ধরে নিই যে এটি জিএনইউ / লিনাক্স থেকে হারিয়েছে কারণ আরএমএস গ্রুপ এবং অনুমতিগুলিতে বিশ্বাস করে না। :-)
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.
এখানে একটি খুব সহজ অ্যাডক স্ক্রিপ্ট যা অন্য জবাবগুলিতে তালিকাবদ্ধ সমস্ত সাধারণ সমস্যাগুলি আমলে নিলে:
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}'
আমি এটি আমার এলডিএপ-সক্ষম সক্ষম সেটআপটি দিয়ে ব্যবহার করছি, সোলারিস 8+ এবং এইচপিক্স সহ মান-সম্মতিযুক্ত জেন্ট এবং অ্যাডকের সাথে যে কোনও কিছুতে চালিত।
getent group groupname | awk -F: '{print $4}' | tr , '\n'
এটির 3 টি অংশ রয়েছে:
1 - getent group groupname
"/ etc / গ্রুপ" ফাইলে গ্রুপটির লাইন দেখায়। বিকল্প cat /etc/group | grep groupname
।
2 - awk
মুদ্রণ কেবলমাত্র একক লাইনে থাকা সদস্যদের ',' দিয়ে তৈরি করা হয়েছে।
3 - tr
একটি 'নতুন' রেখা সহ ',' প্রতিস্থাপন করুন এবং প্রতিটি ব্যবহারকারীকে একের পর এক মুদ্রণ করুন।
4 - alচ্ছিক: sort
ব্যবহারকারীরা যদি খুব বেশি হয় তবে আপনি এর সাথে অন্য একটি পাইপও ব্যবহার করতে পারেন।
শুভেচ্ছা সহ
আমি মনে করি সবচেয়ে সহজ উপায় হ'ল নিম্নলিখিত পদক্ষেপগুলি, আপনার কোনও প্যাকেজ বা সফ্টওয়্যার ইনস্টল করার প্রয়োজন হবে না:
প্রথমে আপনি যে গোষ্ঠীর ব্যবহারকারীদের জানতে চান তার জিআইডিটি সন্ধান করুন, এর জন্য অনেকগুলি উপায় রয়েছে: বিড়াল / ইত্যাদি / গোষ্ঠী (শেষ কলামটি জিআইডি) আইডি ব্যবহারকারী (ব্যবহারকারী এমন কেউ যার সাথে সম্পর্কিত দলটি)
এখন আপনি সমস্ত ব্যবহারকারীকে ফাইল / ইত্যাদি / পাসডাব্লুডিতে তালিকাভুক্ত করবেন, তবে আপনি পূর্ববর্তী গোষ্ঠীর সদস্যদের পেতে নিম্নলিখিত কমান্ডের সিক্যুয়েল সহ কয়েকটি ফিল্টার প্রয়োগ করবেন।
কাটা-ডি: -f1,4 / ইত্যাদি / পাসডাব্লু | গ্রেপ জিআইডি (জিআইডি হ'ল আপনি পদক্ষেপ 1 থেকে প্রাপ্ত নম্বর)
কাট কমান্ড ফাইলটির কিছু "কলাম" নির্বাচন করবে, প্যারামিটারটি ডিলিমেটার সেট করে ":" এই ক্ষেত্রে, পরামিতি -f "ক্ষেত্র" (বা কলাম) নির্বাচন করে বাইরে এবং বাইরে (1 টি) প্রদর্শিত হবে ফাইল / ইত্যাদি / পাসডাব্লুড, 1º কলামটি ব্যবহারকারীর নাম এবং 4º ব্যবহারকারীর গোষ্ঠীর জিআইডি), চূড়ান্ত করতে | গ্রেপ জিআইডি কেবলমাত্র গ্রুপটিকে (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 টি উত্তরে রয়েছে, আপনার উত্তর তাদের সাথে কোন মান যুক্ত করে? এছাড়াও, অন্যান্য সমস্ত উত্তরের মন্তব্য রয়েছে যে এই জাতীয় সমাধানটি কেবলমাত্র মাধ্যমিক গোষ্ঠীগুলির জন্য কাজ করে এবং এলডিএপি, এনআইএস ইত্যাদি দ্বারা পরিচালিত অ্যাকাউন্টের জন্যও কাজ করে না