Apakah ada yang tahu mengapa perintah linux
groups
menunjukkan output yang berbeda dari
groups username
Pengguna yang masuk sama dengan nama pengguna parameter. Contoh:
thorsten@ubuntu:~/tmp$ groups
thorsten adm dialout cdrom plugdev lpadmin admin sambashare
thorsten@ubuntu:~/tmp$ groups thorsten
thorsten : thorsten adm dialout cdrom plugdev nogroup lpadmin admin sambashare
linux
user-accounts
Thorsten Niehues
sumber
sumber
Jawaban:
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
dangroup
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 bahwasu $USER
akan muncul shell dengan daftar grup yang diperbarui.sumber
groups
dengan sendirinya memberikan keanggotaan grup saat pemilik proses. Ini dapat berbeda darigroups <username>
jika groupdb telah berubah sejak proses dimulai atau pemilik proses berubah.sumber
groups
tidak memberikan keanggotaan saat ini , melainkan apa yang "saat ini" pada saat proses login (/ sbin / login, gdm, sshd) dipanggilinitgroups()
.Nyalakan kembali komputer dan grup dan grup pengguna harus memberikan hasil yang sama.
Alasan mereka berbeda adalah karena Anda menambahkan diri Anda ke grup baru yang bukan anggota ketika Anda memulai komputer.
sumber
su
, menutup pembukaan kembali sesi saat ini). Anda juga dapat menggunakannewgrp
untuk memulai proses dengan grup baru disertakan.Jalankan
updatedb
, lihat apakah ada perubahan.Hal yang sama di mesin OSX saya ketika groupdb tidak berubah:
sumber