เมื่อคุณเรียกใช้จะค้นหา1ผู้ใช้ที่ระบุในและ(แม้ว่าจะเป็น LDAP, NIS หรืออย่างอื่น2 ) และแสดงกลุ่มทั้งหมดที่คุณพบgroups username
/etc/passwd
/etc/group
ในทางกลับกันเมื่อคุณเรียกใช้groups
คำสั่งโดยไม่ขัดแย้งใด ๆ มันก็จะแสดงรายการทุกกลุ่มตัวเองเป็น3 - ซึ่งเป็นที่ไม่จำเป็น/etc/group
เช่นเดียวกับสิ่งที่ระบุไว้ใน (ดูคำอธิบายด้านล่าง) ในความเป็นจริงการค้นหาเท่านั้นที่ทำขึ้นเพื่อ/etc/group
แปล GID ให้เป็นชื่อกลุ่ม
แต่ละกระบวนการมีชุดของข้อมูลรับรองซึ่งมี (เหนือสิ่งอื่นใด) "รหัสกลุ่มจริง" (GID หลัก), "รหัสกลุ่มที่มีประสิทธิภาพ" (EGID) และรายการของรหัส "กลุ่มเสริม" (GID รอง) โดยค่าเริ่มต้นกระบวนการสืบทอดข้อมูลรับรองจากพาเรนต์ อย่างไรก็ตามกระบวนการที่ทำงานในฐานะรูท (UID 0) หรือมีCAP_SETUID
ความสามารถได้รับอนุญาตให้ตั้งค่าข้อมูลประจำตัวโดยพลการ
โดยเฉพาะอย่างยิ่งเมื่อคุณเข้าสู่ระบบ Linux (ไม่ว่าจะเป็น tty, X11 หรือมากกว่า SSH) กระบวนการเข้าสู่ระบบ (/ bin / เข้าสู่ระบบ, gdm, sshd) จะค้นหาชื่อผู้ใช้ของคุณเพื่อกำหนด UID, GID หลักและ GID รอง . บนเครื่องส่วนบุคคลนี่หมายถึงการอ่านบรรทัดที่เหมาะสมจากpasswd
และgroup
ไฟล์ (หรือ NIS, LDAP และอื่น ๆ )
ถัดไปกระบวนการเข้าสู่ระบบจะเปลี่ยน4เป็นข้อมูลรับรองเหล่านั้นก่อนเริ่มเซสชันของคุณและทุกขั้นตอนที่คุณเปิดใช้ในตอนนี้จะมี UID & GID ที่เหมือนกันแน่นอน - ระบบจะไม่ตรวจสอบ/etc/group
อีกต่อไป5และจะไม่ทำการแก้ไขใด ๆ
ด้วยวิธีนี้/usr/bin/groups
กระบวนการจะเป็นของกลุ่มเดียวกันกับที่คุณทำเมื่อคุณเข้าสู่ระบบไม่ใช่สิ่งที่ฐานข้อมูลบอกว่าคุณเป็น
หมายเหตุ:คำอธิบายข้างต้นใช้กับยูนิกซ์เกือบทั้งหมด ในตระกูล Windows NT (ยกเว้น UID และ GID ทั้งหมดเรียกว่า "SID" ไม่มี "กลุ่มหลัก" ข้อมูลรับรองจะเรียกว่า "กระบวนการโทเค็น" และCAP_SETUID
เป็นSeCreateTokenPrivilegeหรือSeTcbPrivilege ); และน่าจะเป็นระบบปฏิบัติการหลายผู้ใช้ส่วนใหญ่
1 getpwuid () และ getgrouplist () ใช้เพื่อค้นหากลุ่มผู้ใช้
2บน Linux, glibc ใช้/etc/nsswitch.conf
เพื่อกำหนดตำแหน่งที่จะค้นหาข้อมูลนี้
3 groups
ใช้ getgid (), getegid () และ getgroups () เพื่อรับสิทธิของตัวเอง
4 setuid (), setgid (), initgroups () และที่เกี่ยวข้อง
5ข้อยกเว้นของหลักสูตรเป็นเครื่องมือต่างๆที่ใช้งานสูง ( setuid ) เช่นsu
, sudo
, sg
, newgrp
, pkexec
และอื่น ๆ ซึ่งหมายความว่าsu $USER
จะวางไข่เชลล์ด้วยรายการกลุ่มที่อัปเดต