Linux: grup vs grup nama pengguna


12

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

1
Ada begitu banyak duplikat dari pertanyaan ini sehingga saya bahkan tidak tahu harus mulai dari mana.
user1686

Jawaban:


12

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 groupsperintah 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/groupadalah 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_SETUIDkemampuan 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 passwddan groupfile 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/grouplagi 5 dan tidak akan mengambil modifikasi apa pun yang dibuat.

Dengan cara ini, /usr/bin/groupsproses 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_SETUIDadalah 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.confuntuk 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 $USERakan muncul shell dengan daftar grup yang diperbarui.


3

groupsdengan sendirinya memberikan keanggotaan grup saat pemilik proses. Ini dapat berbeda dari groups <username>jika groupdb telah berubah sejak proses dimulai atau pemilik proses berubah.


groupstidak memberikan keanggotaan saat ini , melainkan apa yang "saat ini" pada saat proses login (/ sbin / login, gdm, sshd) dipanggil initgroups().
user1686

1

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.


Anda tentu tidak perlu me-reboot seluruh sistem! Anda hanya perlu memulai sesi login baru (yaitu pada konsol virtual baru, menggunakan su, menutup pembukaan kembali sesi saat ini). Anda juga dapat menggunakan newgrpuntuk memulai proses dengan grup baru disertakan.
pabouk

1
Saya hanya bermaksud memberikan solusi perbaikan cepat sederhana yang akan bekerja setiap saat. Ada banyak jawaban lain yang sudah menjawab pertanyaan ini dengan sangat rinci. Terkadang apa yang orang inginkan, seperti yang ada dalam kasus saya, adalah solusi sederhana yang hanya berfungsi tanpa melalui beberapa langkah.
Alex

0

Jalankan updatedb, lihat apakah ada perubahan.

Hal yang sama di mesin OSX saya ketika groupdb tidak berubah:

albert-hotspot:~ sami$ groups sami
staff com.apple.access_screensharing com.apple.sharepoint.group.2 everyone _appstore localaccounts _appserverusr admin _appserveradm _lpadmin _lpoperator _developer
albert-hotspot:~ sami$ groups
staff com.apple.access_screensharing com.apple.sharepoint.group.2 everyone _appstore localaccounts _appserverusr admin _appserveradm _lpadmin _lpoperator _developer
albert-hotspot:~ sami$ 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.