ฉันจะทราบได้อย่างไรว่าผู้ใช้รายใดอยู่ในกลุ่มภายใน Linux


68

ฉันเพิ่งสร้างผู้ใช้ใหม่และกำหนดให้กับกลุ่มบางกลุ่ม ฉันสงสัยว่ามีคำสั่งที่แสดงผู้ใช้ทั้งหมดที่กำหนดให้กับกลุ่มใดกลุ่มหนึ่งหรือไม่? ฉันได้ลองใช้คำสั่ง 'กลุ่ม' แต่เมื่อใดก็ตามที่ฉันใช้มันมันบอกว่า 'กลุ่ม: ไม่พบ'


3
นั่นคือgroupsคำสั่ง ไม่น่าเป็นไปได้ที่คุณไม่ได้ใช้งานบน Linux เนื่องจากเป็นส่วนหนึ่งของ coreutils
โทมัส Dickey

@ThomasDickey แต่ก็เป็นไปได้ - เหมือน NASes บางคน
โธมัสดับเบิลยู.

คำตอบ:


43

คุณสามารถใช้ grep:

grep '^group_name_here:' /etc/group

รายการนี้แสดงเฉพาะการเป็นสมาชิกกลุ่มเสริมไม่ใช่ผู้ใช้ที่มีกลุ่มนี้เป็นกลุ่มหลัก และพบกลุ่มโลคัลเท่านั้นไม่ใช่กลุ่มจากบริการเครือข่ายเช่น LDAP


6
ไม่ทำงานกับการพิสูจน์ตัวตนจากส่วนกลาง
Maxim Egorushkin

1
สิ่งนี้อาจสร้างความสับสนได้อย่างแท้จริงเนื่องจากความแตกต่างหลัก / รอง ฉันคิดว่าสิ่งนี้ควรหลีกเลี่ยงเพื่อประโยชน์ของsudo lid -g {group}ฉันฉันมีระบบที่คำตอบนี้จะแสดงผู้ใช้ 8 คนในกลุ่มในขณะที่sudo lid -g {group}รายการที่ 10
DKroot

ดูgetentคำตอบโดย @Murray Jensen ด้านล่าง
scrutari

84

ฉันชอบที่จะใช้คำสั่งgetent ...

เนื่องจาก getent ใช้บริการชื่อเดียวกับระบบ getent จะแสดงข้อมูลทั้งหมดรวมถึงที่ได้รับจากแหล่งข้อมูลเครือข่ายเช่น LDAP

ดังนั้นสำหรับกลุ่มคุณควรใช้สิ่งต่อไปนี้ ...

getent group name_of_group

โดยที่name_of_groupถูกแทนที่ด้วยกลุ่มที่คุณต้องการค้นหา โปรดทราบว่าสิ่งนี้จะส่งคืนเฉพาะการเป็นสมาชิกกลุ่มเสริมเท่านั้นโดยไม่รวมผู้ใช้ที่มีกลุ่มนี้เป็นกลุ่มหลัก

มีการค้นหาอื่น ๆ อีกมากมายที่คุณสามารถทำได้ ... passwdเป็นอีกหนึ่งการค้นหาที่มีประโยชน์ซึ่งคุณจะต้องแสดงรายการกลุ่มหลัก


1
คำตอบอื่น ๆ จะไม่มีผลถ้าคุณไม่ใช่ผู้ดูแลระบบและข้อมูลกลุ่มจะถูกเก็บไว้ในเซิร์ฟเวอร์อื่น
Andrés Alcarraz

1
สิ่งนี้อาจสร้างความสับสนได้อย่างแท้จริงเนื่องจากความแตกต่างหลัก / รอง ฉันคิดว่าสิ่งนี้ควรหลีกเลี่ยงเพื่อประโยชน์ของsudo lid -g {group}ฉันฉันมีระบบที่คำตอบนี้จะแสดงผู้ใช้ 8 คนในกลุ่มขณะที่sudo lid -g {group}รายการที่ 10
DKroot

12

ง่ายกว่าที่จะทำ groups [username]

หากคุณต้องการแสดงรายชื่อผู้ใช้ในพื้นที่และกลุ่มในพื้นที่คุณสามารถทำได้

cat /etc/passwd | awk -F':' '{ print $1}' | xargs -n1 groups

หากคุณได้รับ "กลุ่ม: ไม่พบคำสั่ง" เป็นไปได้ว่าคุณได้แก้ไขเส้นทางสิ่งแวดล้อมของคุณให้แย่ลงเพื่อรีเซ็ตเส้นทางของคุณ PATH=$(getconf PATH)


มันทำงานสำหรับกลุ่มเฉพาะถ้า| grep {group}มีการเพิ่มและให้คำตอบที่ถูกต้องไม่เหมือนgetent group name_of_groupหรือgrep '^group_name_here:' /etc/group
DKroot

1
แทนที่จะcat /etc/passwdคุณควรใช้gentent passwdเพื่อให้ผู้ใช้ใน NIS / LDAP จะยังคงได้รับการจดทะเบียน ข้อเสียเปรียบเพียงอย่างเดียวคือมันอาจใช้เวลาสักครู่
Brian Minton

8
groupmems -g groupname -l

แสดงรายชื่อผู้ใช้ทั้งหมดในกลุ่มที่มีชื่อ


โปรดทราบว่าgroupmemsเป็นส่วนหนึ่งของ shadow utils ที่ใช้กับ Linux distros ส่วนใหญ่ แต่groupmemsปัจจุบันขาดจาก Debian และอนุพันธ์ ( ข้อผิดพลาดตอนนี้ได้รับการแก้ไข แต่ยังไม่รวมอยู่ในรุ่นใด ๆ (ณ เดือนพฤศจิกายน 2559))
Stéphane Chazelas

2
โปรดทราบว่าgroupmemsเฉพาะข้อตกลงกับกลุ่มใน/etc/group(ไม่ใช่กลุ่มใน LDAP หรือฐานข้อมูลผู้ใช้อื่น ๆ ) และต้องการสิทธิ์ผู้ใช้ระดับสูงเนื่องจากจะพยายามเปิด / etc / gshadow
Stéphane Chazelas

แม้จะมีข้อแม้ดังกล่าวข้างต้นคำสั่งนี้เหมาะสำหรับบางสถานการณ์เพราะมันไม่จำเป็นต้องแยกวิเคราะห์เพิ่มเติมของการส่งออก (เช่นcutและเพื่อน ๆ )
bonh

สิ่งนี้อาจสร้างความสับสนได้อย่างแท้จริงเนื่องจากความแตกต่างหลัก / รอง sudo lid -g {group}ผมคิดว่านี่ควรจะหลีกเลี่ยงในความโปรดปรานของ ฉันมีระบบที่คำตอบนี้แสดงผู้ใช้ 8 คนในกลุ่มในขณะที่sudo lid -g {group}รายการที่ 10
DKroot

5

ฉันประหลาดใจที่ไม่มีใครพูดถึง

id <user>

คำสั่งนี้จะให้รายชื่อกลุ่มที่ผู้ใช้อยู่


3
เพราะ - ตรงข้ามกับชื่อ - ผู้ถามต้องการทราบผู้ใช้ภายในกลุ่มที่กำหนดไม่ใช่กลุ่มของผู้ใช้ที่ระบุตามรายละเอียดในคำถาม ตอนนี้ฉันเปลี่ยนชื่อใหม่เพื่อให้ตรงกับเนื้อหา
Dubu

ฉันเห็นแล้ว ฉันควรอ่านข้อความคำถามให้ดีขึ้น ขอบคุณ
อเล็กซ์

4

groupsคำสั่งพิมพ์สมาชิกกลุ่มสำหรับผู้ใช้ คุณสามารถใช้lidคำสั่งเพื่อแสดงรายการผู้ใช้ในกลุ่มเช่น:

# lid -g <groupname>

4
lidเป็นส่วนหนึ่งของ libuser ซึ่งไม่ได้ติดตั้งตามค่าเริ่มต้นในการกระจายจำนวนมาก
Chris Down

2

OP ใช้คำถามเพื่อแยกความเป็นไปได้ของการใช้คำสั่งกลุ่ม เนื่องจากเป็นส่วนหนึ่งของ coreutils บน Linux ทั้ง (a) มันถูกลบออกหรือ (b) OP เป็นชื่อที่พิมพ์ผิด

OP อาจใช้groupsสิ่งนี้เช่น:

for name in $(cut -d: -f1 /etc/passwd);do groups $name|grep -w sudo|awk '{print $1;}';done

หนึ่งคำตอบปัญหาเพียง grep /etc/groupสำหรับชื่อกลุ่มใน บางครั้งก็ทำงานได้ตามที่ตั้งใจไว้

การใช้grep ที่ดีขึ้นเล็กน้อยจะคำนึงถึงไวยากรณ์ของ/etc/group:

group_name:password:GID:user_list

ดังนั้นเฉพาะบางส่วนก่อนเครื่องหมายโคลอนแรกจึงเป็นชื่อกลุ่มที่ถูกต้อง grep ธรรมดาโดยไม่คำนึงถึงไวยากรณ์สามารถ (และจะ) รับการจับคู่ที่ทำให้เข้าใจผิดจากไฟล์ ใช้นิพจน์ทั่วไปเพื่อให้ grep ตรงกันกับสิ่งที่ต้องการ:

grep -E '^users:' /etc/group |sed -e 's/^.*://'

หรือใช้ตัวแปรเชลล์:

grep -E '^'$groupname':' /etc/group |sed -e 's/^.*://'

อย่างไรก็ตามจะแสดงเฉพาะรายการที่ไม่อยู่ในกลุ่มเริ่มต้นเท่านั้น ในการเพิ่มเหล่านั้นคุณต้องคำนึงถึงไฟล์รหัสผ่านเช่นโดยการแยกหมายเลขรหัสประจำตัวจาก/etc/groupและพิมพ์ผู้ใช้ที่ตรงกับกลุ่มเริ่มต้นจาก/etc/passwdเช่น

grp=$(awk -F: '$1 ~ /^users$/ {print $3; }' </etc/group)
awk -F: '$4 ~ /^'$grp'$/ { print $1; }' </etc/passwd

คุณสามารถทำสิ่งเดียวกันโดยใช้เพียง grep และ sed แต่มันทำงานได้ดีกว่าการใช้ awk

คำตอบที่แนะนำอีกข้อเสนอโดยใช้getentซึ่งก็น่าจะเป็นในเครื่อง Linux (กับ Debian มันเป็นส่วนหนึ่งของ GNU libc) อย่างไรก็ตามการตรวจสอบอย่างรวดเร็วของที่แสดงให้เฉพาะ/etc/groupเนื้อหา

ฉัน (เหมือนส่วนใหญ่) ไม่มีlibusersหรือlidติดตั้งดังนั้นฉันจึงไม่สามารถแสดงความคิดเห็นได้ว่ามันเป็นไปตามเงื่อนไขของ OP หรือไม่

นอกจากนี้ยังมีidโปรแกรมที่ให้ข้อมูลกลุ่ม บางคนอาจขยายคำตอบให้ได้


หรือเพียงsed -n "s/^$groupname:.*://p" /etc/groupแต่ยังคงสามารถรายงานผลลัพธ์ที่ไม่ถูกต้องหากชื่อกลุ่มมีตัวดำเนินการ RE ( .เช่นไม่ใช่เรื่องแปลกในชื่อกลุ่ม)
Stéphane Chazelas

GNU getentจะทำการค้นหา LDAP / NIS ด้วยเช่นกัน แต่อาจไม่ได้เมื่อการแจงนับถูกปิดใช้งานอย่างชัดเจนสำหรับฐานข้อมูลกลุ่ม
Stéphane Chazelas

โปรดทราบว่าgroupsจะไม่ช่วยให้มันแสดงกลุ่มที่ผู้ใช้ที่ได้รับเป็นสมาชิกเมื่อเทียบกับรายชื่อสมาชิกของกลุ่มที่กำหนด
Stéphane Chazelas

2

ทำงานเหมือนมีเสน่ห์:

cut -d: -f1,4 /etc/passwd | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1

ซึ่งแตกต่างจากคำตอบที่ได้รับการยอมรับของ @ARG คำสั่งนี้จะแสดงรายการผู้ใช้ที่มี <groupname> เป็นกลุ่มหลัก
Bhavik

นี่ควรเป็นคำตอบที่ได้รับการยอมรับ
Nikolay Nenov

1
ฉันไม่เห็นด้วย. เพราะมันอ่านผู้ใช้ใน / etc / passwd นี้จะไม่ทำงานกับโมดูล nsswitch อื่น ๆ ที่เข้าถึง ฯลฯ LDAP
อีวานVučica

ทำงานไม่ถูกต้องสำหรับฉัน: ฉันมีสมาชิก 4 คนในกลุ่มในขณะที่sudo lid -gรายการ 8 @Bhavik คำตอบที่ยอมรับไม่ถูกต้องเช่นกัน
DKroot

2

บางคนจะบอกให้คุณติดตั้ง libuser (สำหรับ 'ฝา') หรือสมาชิก (สำหรับ 'สมาชิก') แต่สร้างจากคำตอบhttps://unix.stackexchange.com/a/349648/77959ซึ่งจัดการปัญหานี้ด้วยการเป็นสมาชิกกลุ่มเข้าสู่ระบบฉันพบว่ากลุ่มอื่นไม่ได้รับการคุ้มครองโดยสคริปต์นั้น ดังนั้น - นี่คือวิธีที่ดีที่สุดของทั้งสองวิธีรวมกัน:

#!/bin/bash
if [ $# -eq 1 ]; then
        list_a=`cut -d: -f1,4 /etc/passwd | grep $(getent group "$1"| cut -d: -f3) | cut -d: -f1`
        list_b=`getent group "$1"|cut -d: -f4|sed 's/,/\n/g'`
        echo -e "$list_a\n$list_b"|grep -v "^$"|sort|uniq
else
        echo "pass me a group to find the members of"
fi

มันทำงานได้อย่างถูกต้องในระบบของฉันซึ่งแตกต่างจากคำตอบที่เกี่ยวข้องgetentหรือ grep'^group_name_here:' /etc/group
DKroot

0

การดัดแปลง user3717722 วิธีนี้จะแสดงรายการ groupmembers ในฐานข้อมูล NIS:

ypcat passwd | cut -d: -f1,4 | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.