Ketika Anda menjalankan , itu mencari 1 pengguna yang diberikan di dan (meskipun itu bisa LDAP, NIS atau sesuatu yang lain 2 ) dan menunjukkan kepada Anda semua grup ditemukan.groups username
/etc/passwd
/etc/group
Di sisi lain, ketika Anda menjalankan groups
perintah tanpa argumen, itu hanya daftar semua kelompok itu sendiri milik 3 - yang belum tentu sama dengan apa yang terdaftar /etc/group
. (Lihat di bawah untuk penjelasan.) Faktanya, satu - satunya pencarian yang dilakukan /etc/group
adalah menerjemahkan GID ke nama grup.
Setiap proses memiliki seperangkat kredensial , yang berisi (antara lain) "ID grup nyata" (GID primer), "ID grup efektif" (EGID), dan daftar ID "grup pelengkap" (GID sekunder). Secara default, suatu proses mewarisi kredensial dari induknya; Namun, proses yang berjalan sebagai root (UID 0) atau memiliki CAP_SETUID
kemampuan diizinkan untuk menetapkan kredensial sewenang-wenang.
Khususnya, ketika Anda masuk ke Linux (baik dalam tty, X11, atau melalui SSH), proses login (/ bin / login, gdm, sshd) mencari nama pengguna Anda untuk menentukan UID, GID primer, dan GID sekunder Anda . Pada mesin pribadi, ini hanya berarti membaca baris passwd
dan group
file yang sesuai (atau NIS, LDAP, dll).
Selanjutnya, proses masuk beralih 4 ke kredensial tersebut sebelum memulai sesi Anda, dan setiap proses yang Anda luncurkan mulai sekarang akan memiliki UID & GID yang sama persis - sistem tidak memeriksa /etc/group
lagi 5 dan tidak akan mengambil modifikasi apa pun yang dibuat.
Dengan cara ini, /usr/bin/groups
proses tersebut akan menjadi milik grup yang sama seperti yang Anda lakukan ketika Anda masuk , bukan apa yang menurut database Anda.
Catatan: Penjelasan di atas juga berlaku untuk hampir semua Unix; keluarga Windows NT (kecuali UID dan Gids semua dipanggil "SIDS", tidak ada "kelompok utama", kepercayaan disebut "proses tanda", dan CAP_SETUID
adalah SeCreateTokenPrivilege atau SeTcbPrivilege ); dan kemungkinan untuk sebagian besar sistem operasi multi-pengguna.
1 getpwuid () dan getgrouplist () digunakan untuk mencari grup pengguna.
2 Di Linux, glibc menggunakan /etc/nsswitch.conf
untuk menentukan di mana mencari informasi ini.
3 groups
menggunakan getgid (), getegid () dan getgroups () untuk mendapatkan kredensial sendiri.
4 setuid (), setgid (), initgroups () dan yang terkait.
5 Pengecualian, tentu saja, adalah berbagai alat yang menjalankan ditinggikan ( setuid ) seperti su
, sudo
, sg
, newgrp
, pkexec
, dan sebagainya. Ini berarti bahwa su $USER
akan muncul shell dengan daftar grup yang diperbarui.