ฉันเพิ่งสร้างผู้ใช้ใหม่และกำหนดให้กับกลุ่มบางกลุ่ม ฉันสงสัยว่ามีคำสั่งที่แสดงผู้ใช้ทั้งหมดที่กำหนดให้กับกลุ่มใดกลุ่มหนึ่งหรือไม่? ฉันได้ลองใช้คำสั่ง 'กลุ่ม' แต่เมื่อใดก็ตามที่ฉันใช้มันมันบอกว่า 'กลุ่ม: ไม่พบ'
ฉันเพิ่งสร้างผู้ใช้ใหม่และกำหนดให้กับกลุ่มบางกลุ่ม ฉันสงสัยว่ามีคำสั่งที่แสดงผู้ใช้ทั้งหมดที่กำหนดให้กับกลุ่มใดกลุ่มหนึ่งหรือไม่? ฉันได้ลองใช้คำสั่ง 'กลุ่ม' แต่เมื่อใดก็ตามที่ฉันใช้มันมันบอกว่า 'กลุ่ม: ไม่พบ'
คำตอบ:
คุณสามารถใช้ grep:
grep '^group_name_here:' /etc/group
รายการนี้แสดงเฉพาะการเป็นสมาชิกกลุ่มเสริมไม่ใช่ผู้ใช้ที่มีกลุ่มนี้เป็นกลุ่มหลัก และพบกลุ่มโลคัลเท่านั้นไม่ใช่กลุ่มจากบริการเครือข่ายเช่น LDAP
sudo lid -g {group}
ฉันฉันมีระบบที่คำตอบนี้จะแสดงผู้ใช้ 8 คนในกลุ่มในขณะที่sudo lid -g {group}
รายการที่ 10
getent
คำตอบโดย @Murray Jensen ด้านล่าง
ฉันชอบที่จะใช้คำสั่งgetent ...
เนื่องจาก getent ใช้บริการชื่อเดียวกับระบบ getent จะแสดงข้อมูลทั้งหมดรวมถึงที่ได้รับจากแหล่งข้อมูลเครือข่ายเช่น LDAP
ดังนั้นสำหรับกลุ่มคุณควรใช้สิ่งต่อไปนี้ ...
getent group name_of_group
โดยที่name_of_groupถูกแทนที่ด้วยกลุ่มที่คุณต้องการค้นหา โปรดทราบว่าสิ่งนี้จะส่งคืนเฉพาะการเป็นสมาชิกกลุ่มเสริมเท่านั้นโดยไม่รวมผู้ใช้ที่มีกลุ่มนี้เป็นกลุ่มหลัก
มีการค้นหาอื่น ๆ อีกมากมายที่คุณสามารถทำได้ ... passwd
เป็นอีกหนึ่งการค้นหาที่มีประโยชน์ซึ่งคุณจะต้องแสดงรายการกลุ่มหลัก
sudo lid -g {group}
ฉันฉันมีระบบที่คำตอบนี้จะแสดงผู้ใช้ 8 คนในกลุ่มขณะที่sudo lid -g {group}
รายการที่ 10
ง่ายกว่าที่จะทำ 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
cat /etc/passwd
คุณควรใช้gentent passwd
เพื่อให้ผู้ใช้ใน NIS / LDAP จะยังคงได้รับการจดทะเบียน ข้อเสียเปรียบเพียงอย่างเดียวคือมันอาจใช้เวลาสักครู่
groupmems -g groupname -l
แสดงรายชื่อผู้ใช้ทั้งหมดในกลุ่มที่มีชื่อ
groupmems
เป็นส่วนหนึ่งของ shadow utils ที่ใช้กับ Linux distros ส่วนใหญ่ แต่groupmems
ปัจจุบันขาดจาก Debian และอนุพันธ์ ( ข้อผิดพลาดตอนนี้ได้รับการแก้ไข แต่ยังไม่รวมอยู่ในรุ่นใด ๆ (ณ เดือนพฤศจิกายน 2559))
groupmems
เฉพาะข้อตกลงกับกลุ่มใน/etc/group
(ไม่ใช่กลุ่มใน LDAP หรือฐานข้อมูลผู้ใช้อื่น ๆ ) และต้องการสิทธิ์ผู้ใช้ระดับสูงเนื่องจากจะพยายามเปิด / etc / gshadow
cut
และเพื่อน ๆ )
sudo lid -g {group}
ผมคิดว่านี่ควรจะหลีกเลี่ยงในความโปรดปรานของ ฉันมีระบบที่คำตอบนี้แสดงผู้ใช้ 8 คนในกลุ่มในขณะที่sudo lid -g {group}
รายการที่ 10
ฉันประหลาดใจที่ไม่มีใครพูดถึง
id <user>
คำสั่งนี้จะให้รายชื่อกลุ่มที่ผู้ใช้อยู่
groups
คำสั่งพิมพ์สมาชิกกลุ่มสำหรับผู้ใช้ คุณสามารถใช้lid
คำสั่งเพื่อแสดงรายการผู้ใช้ในกลุ่มเช่น:
# lid -g <groupname>
lid
เป็นส่วนหนึ่งของ libuser ซึ่งไม่ได้ติดตั้งตามค่าเริ่มต้นในการกระจายจำนวนมาก
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 ( .
เช่นไม่ใช่เรื่องแปลกในชื่อกลุ่ม)
getent
จะทำการค้นหา LDAP / NIS ด้วยเช่นกัน แต่อาจไม่ได้เมื่อการแจงนับถูกปิดใช้งานอย่างชัดเจนสำหรับฐานข้อมูลกลุ่ม
groups
จะไม่ช่วยให้มันแสดงกลุ่มที่ผู้ใช้ที่ได้รับเป็นสมาชิกเมื่อเทียบกับรายชื่อสมาชิกของกลุ่มที่กำหนด
ทำงานเหมือนมีเสน่ห์:
cut -d: -f1,4 /etc/passwd | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
sudo lid -g
รายการ 8 @Bhavik คำตอบที่ยอมรับไม่ถูกต้องเช่นกัน
บางคนจะบอกให้คุณติดตั้ง 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
การดัดแปลง user3717722 วิธีนี้จะแสดงรายการ groupmembers ในฐานข้อมูล NIS:
ypcat passwd | cut -d: -f1,4 | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
groups
คำสั่ง ไม่น่าเป็นไปได้ที่คุณไม่ได้ใช้งานบน Linux เนื่องจากเป็นส่วนหนึ่งของ coreutils