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 groups
lệ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/group
là để 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_SETUID
khả 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 passwd
và group
tệ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/group
nữ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/groups
quy 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_SETUID
là 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 $USER
sẽ sinh ra một shell với danh sách nhóm được cập nhật.