Linux: nome utente gruppi / gruppi


10

Qualcuno sa perché il comando linux

    groups 

mostra un output diverso da

    groups username 

L'utente che ha effettuato l'accesso è uguale al nome utente del parametro. Esempio:

    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
Ci sono così tanti duplicati di questa domanda che non so nemmeno da dove cominciare.
grawity

Risposte:


10

Quando corri groups nome utente , alza lo sguardo 1 l'utente specificato in /etc/passwd e /etc/group (anche se può essere LDAP, NIS o qualcos'altro 2 ) e mostra tutti i gruppi trovati.

D'altra parte, quando esegui il groups comando senza argomenti, elenca semplicemente tutti i gruppi esso stesso appartiene a 3 - che è non necessariamente lo stesso di ciò che è elencato in /etc/group. (Vedi sotto per una spiegazione). In effetti, il solo ricerche fatte a /etc/group sono per la traduzione di GID per i nomi dei gruppi.


Ogni processo ha un insieme di credenziali , che contiene (tra le altre cose) un "ID gruppo reale" (GID primario), un "ID gruppo efficace" (EGID) e un elenco di ID "gruppo supplementare" (GID secondari). Di default, un processo eredita le sue credenziali dal suo genitore; tuttavia, i processi eseguiti come root (UID 0) o con il CAP_SETUID capacità sono autorizzati a impostare credenziali arbitrarie.

In particolare, quando si accede a Linux (sia in tty, X11 o SSH), il processo di login (/ bin / login, gdm, sshd) cerca il proprio nome utente per determinare l'UID, il GID primario e i GID secondari . Su una macchina personale, questo significa solo leggere le linee appropriate da passwd e group file (o NIS, LDAP, ecc.).

Quindi, passa il processo di login 4 a quelle credenziali prima di iniziare la sessione, e ogni processo che avvierai da ora in poi avrà lo stesso identico UID e amp; GID: il sistema non controlla /etc/group più 5 e non prenderà alcuna modifica fatta.

In questo modo, il /usr/bin/groups il processo apparterrà agli stessi gruppi come hai fatto tu quando hai effettuato il login non ciò che il database dice che sei dentro

Nota: La spiegazione di cui sopra si applica anche a quasi tutti gli Unix; alla famiglia Windows NT (eccetto UID e GID sono tutti chiamati "SID", non c'è "gruppo primario", le credenziali sono chiamate "token di processo" e CAP_SETUID è SeCreateTokenPrivilege o SeTcbPrivilege ); e probabilmente alla maggior parte degli altri sistemi operativi multi-utente.


1 getpwuid () e getgrouplist () sono usati per cercare i gruppi di un utente.

2 Su Linux, usa glibc /etc/nsswitch.conf determinare dove cercare queste informazioni

3 groups usa getgid (), getegid () e getgroups () per ottenere le proprie credenziali.

4 setuid (), setgid (), initgroups () e relativi.

5 Un'eccezione, ovviamente, sono i vari strumenti che eseguono elevati ( setuid ) ad esempio su, sudo, sg, newgrp, pkexec, e così via. Ciò significa che su $USER genererà una shell con l'elenco dei gruppi aggiornato.


3

groups da solo dà il attuale appartenenza al gruppo del proprietario del processo. Questo può differire da groups <username> se il groupdb è cambiato da quando il processo è iniziato o il proprietario del processo è cambiato.


groups non dà attuale appartenenza, ma piuttosto quella che era "attuale" al momento in cui il processo di login (/ sbin / login, gdm, sshd) chiamava initgroups().
grawity

1

Basta riavviare il computer e sia i gruppi che i gruppi utente dovrebbero dare gli stessi risultati.

La ragione per cui erano diversi era perché ti sei aggiunto a un nuovo gruppo di cui non eri membro quando avvii il computer.


Certamente non è necessario riavviare l'intero sistema! Hai solo bisogno di iniziare una nuova sessione di accesso (ad esempio su una nuova console virtuale, utilizzando su, chiudendo una riapertura della sessione corrente). Puoi anche usare newgrp per avviare i processi con il nuovo gruppo incluso.
pabouk

1
Volevo solo dare una soluzione rapida e semplice che funzionasse sempre. Ci sono molte altre risposte che già rispondono a questa domanda in modo molto dettagliato. A volte ciò che le persone vogliono, come nel mio caso, è una soluzione semplice che funziona senza passaggi.
Alex

0

Correre updatedb, vedi se c'è qualche cambiamento.

Lo stesso nella mia macchina OSX quando groupdb non è cambiato:

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$ 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.