Khi bạn chạy , nó sẽ tra cứu 1 người dùng đã cho và (mặc dù đó có thể là LDAP, NIS hoặc thứ gì khác 2 ) và hiển thị cho bạn tất cả các nhóm được tìm thấy.groups username/etc/passwd/etc/group
Mặt khác, khi bạn chạy groupslệnh mà không có bất kỳ đối số nào, nó chỉ liệt kê tất cả các nhóm mà nó thuộc về 3 - không nhất thiết giống như những gì được liệt kê trong đó /etc/group. (Xem phần giải thích bên dưới.) Trong thực tế, các tra cứu duy nhất được thực hiện /etc/grouplà để dịch GID sang tên nhóm.
Mỗi quy trình có một bộ thông tin xác thực , bao gồm (trong số những thứ khác) một "ID nhóm thực" (GID chính), "ID nhóm hiệu quả" (EGID) và danh sách ID "nhóm bổ sung" (GID phụ). Theo mặc định, một quá trình kế thừa thông tin đăng nhập từ cha mẹ của nó; tuy nhiên, các quy trình chạy bằng root (UID 0) hoặc có CAP_SETUIDkhả năng được phép đặt thông tin xác thực tùy ý.
Cụ thể, khi bạn đăng nhập vào Linux (cho dù là tty, X11 hoặc qua SSH), quá trình đăng nhập (/ bin / login, gdm, sshd) sẽ tìm tên người dùng của bạn để xác định UID, GID chính và GID phụ của bạn . Trên máy cá nhân, điều này chỉ có nghĩa là đọc các dòng passwdvà grouptệp thích hợp (hoặc NIS, LDAP, v.v.).
Tiếp theo, quy trình đăng nhập chuyển 4 sang các thông tin đăng nhập đó trước khi bắt đầu phiên của bạn và mọi quy trình bạn khởi chạy từ bây giờ sẽ có cùng UID & GID - hệ thống không kiểm tra /etc/groupnữa 5 và sẽ không nhận bất kỳ sửa đổi nào được thực hiện.
Theo cách này, /usr/bin/groupsquy trình sẽ thuộc về các nhóm giống như bạn đã làm khi bạn đăng nhập , chứ không phải những gì cơ sở dữ liệu nói rằng bạn đang tham gia.
Lưu ý: Giải thích trên cũng áp dụng cho hầu hết tất cả các Unix; đối với gia đình Windows NT (ngoại trừ UID và GID đều được gọi là "SID", không có "nhóm chính", thông tin đăng nhập được gọi là "mã thông báo quy trình" và CAP_SETUIDlà SeCreateTokenPriv đặc biệt hoặc SeTcbPriv đặc biệt ); và có khả năng cho hầu hết các hệ điều hành đa người dùng khác.
1 getpwuid () và getgrouplist () được sử dụng để tra cứu các nhóm người dùng.
2 Trên Linux, glibc sử dụng /etc/nsswitch.confđể xác định nơi cần tìm thông tin này.
3 groups sử dụng getgid (), getegid () và getgroups () để có được thông tin đăng nhập của riêng mình.
4 setuid (), setgid (), initgroups () và có liên quan.
5 Một ngoại lệ, tất nhiên, là những công cụ khác nhau mà chạy cao ( setuid ) chẳng hạn như su, sudo, sg, newgrp, pkexec, và vân vân. Điều này có nghĩa là su $USERsẽ sinh ra một shell với danh sách nhóm được cập nhật.