6.3 Die Datei /etc/group
In der Datei /etc/group werden die Gruppennummern und Gruppennamen einander zugeordnet. In der Datei /etc/passwd wird mit der GID ja praktisch schon eine Standardgruppe für den Benutzer festgelegt. Mit /etc/group können weitere Gruppenzugehörigkeiten eines Benutzers definiert werden. Ein Eintrag in der Datei /etc/group sieht wie folgt aus:
Gruppenname:Passwort:Gruppennummer:Mitglied1,...
|
Gruppenname – der Name der Gruppe |
|
Passwort – Bei älteren Systemen steht hier ein verschlüsseltes Passwort. Befindet sich hier ein »x«, dann bedeutet dies, dass das Passwort (verschlüsselt) in /etc/gshadow abgelegt ist. Die Datei /etc/gshadow ist das Gruppengegenstück von dem, was bei /etc/shadow für die Benutzer gilt. Natürlich kann auch hier ein Passwort entfallen – dann finden Sie hier ein »*« oder »!« wieder. Etwas Besonderes gibt es aber dann doch noch: Wenn ein Passwort eingerichtet ist, können auch Nichtmitglieder dieser Gruppe Zugang zu den Daten der Gruppe erhalten, wenn diese das Passwort kennen. Richten Sie hingegen kein Passwort ein, so können nur Benutzer auf Daten einer Gruppe zugreifen, wenn diese auch wirklich in der Gruppe eingetragen sind. |
|
Gruppennummer (GID) – die Gruppennummer der Gruppe |
|
Mitglieder – Hier werden die Mitglieder der Gruppe eingetragen. Mehrere Mitglieder werden durch ein einfaches Komma getrennt. |
In der Praxis reichen der Gruppenname und die Gruppennummer für einen Eintrag in /etc/group aus. Soll aber ein Benutzer in mehr als einer Gruppe (abgesehen von der Standardgruppe) Mitglied sein, muss dieser in die entsprechende Gruppe eingetragen werden. Ebenfalls sollten Sie einen Eintrag in /etc/group machen, wenn Sie wollen, dass mehrere Mitglieder in einer Gruppe zusammengehören sollen. Solange Sie also nur wollen, dass ein Benutzer in seiner Standardgruppe bleibt, ist kein Eintrag in /etc/group notwendig (weil dieser ja in /etc/passwd vorhanden ist). Dieser Eintrag ist erst nötig, wenn ein Benutzer in weiteren Gruppen Mitglied sein soll. Hier ein Beispiel eines solchen Eintrags:
cdrom:x:24:tot,john,jack
Hier sehen Sie eine Gruppe mit dem Namen »CD-ROM« (ich denke, die Bedeutung spricht für sich) mit der GID 24. Zugriff auf das CD-ROM-Laufwerk hat gewöhnlich nur root. Das »x« zeigt an, dass ein Passwort in /etc/gshadow abgelegt ist. Im Beispiel befindet sich in /etc/gshadow ein »*«, womit für diese Gruppe also kein Passwort nötig ist. Allerdings bedeutet dies auch, dass nur Mitglieder dieser Gruppe Zugang zu ihr haben. Die Mitglieder dieser Gruppe hier lauten »tot«, »john« und »jack«.
Hinweis Die Gruppendatei /etc/group wird in POSIX.1 als Gruppendatenbank (Group Database) bezeichnet.
|
6.3.1 Die Datei /etc/group auswerten
Die einzelnen Felder der Datei /etc/group sind in der Struktur struct group enthalten und in der Headerdatei <grp.h> definiert.
Tabelle 6.3
Die Struktur group in der Headerdatei <grp.h>
Strukturvariable
|
Bedeutung
|
char *gr_name
|
Gruppenname
|
char *gr_passwd
|
Verschlüsseltes Passwort (nicht POSIX.1)
|
gid_t gr_gid
|
Gruppennummer (GID)
|
char **gr_mem
|
Liste von Mitgliedern der Gruppe
|
6.3.2 getgrnam und getgrgid – einzelne Einträge aus /etc/group abfragen
Mit den beiden Funktionen getgrnam() und getgruid() können Sie einen Eintrag der Datei /etc/group erfragen. Die Syntax:
#include <grp.h>
#include <sys/types.h>
struct group *getgrnam(const char *name);
struct group *getgrgid(gid_t gid);
Die Funktion getgrnam() liefert einen Zeiger auf eine Struktur group zurück, welche die Gruppeninformation zur Gruppe name enthält. Diese Information wird natürlich aus der Datei /etc/group gelesen.
Die Funktion getgrgid() liefert ebenfalls einen Zeiger auf eine Struktur group zurück, welche die Gruppeninformation zur Gruppe mit der Gruppennummer gid enthält. Auch diese Information wird aus der Datei /etc/group gelesen.
Beide Funktionen geben bei einem Fehler, oder wenn kein passender Eintrag in /etc/group gefunden wurde, NULL zurück. Konnte kein Speicher für die Struktur group reserviert werden, wird errno auf ENOMEM gesetzt.
Natürlich gilt auch hier, nach einem erneuten Funktionsaufruf wird der alte Inhalt der Struktur überschrieben.
Hierzu soll als Beispiel die Funktion getgrnam() verwendet werden, die alle Informationen zu einem bestimmten Gruppennamen (zweites Argument) zurückliefert.
/* groupname.c */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <grp.h>
#include <string.h>
int main(int argc, char *argv[]) {
struct group *group_ptr;
int i=0;
if( argc != 2 ) {
fprintf(stderr, "Usage: %s Name\n", argv[0]);
exit (EXIT_FAILURE);
}
group_ptr=getgrnam(argv[1]);
if(group_ptr == NULL) {
printf("Konnte nichts über %s ermitteln\n", argv[1]);
exit (EXIT_FAILURE);
}
printf("Folgendes wurde zu %s ermittelt: \n", argv[1]);
printf("Gruppenname : %s\n",
group_ptr->gr_name);
printf("Passwort (verschlüsselt) : %s\n",
group_ptr->gr_passwd);
printf("Gruppennummer : %d\n",
group_ptr->gr_gid);
printf("Mitglieder dieser Gruppe : \n");
while( group_ptr->gr_mem[i] != NULL )
printf("\tName : %s\n", group_ptr->gr_mem[i++]);
return EXIT_SUCCESS;
}
Das Programm bei der Ausführung:
you@host > ./groupname cdrom
Folgende Angaben wurden zu cdrom ermittelt:
Gruppenname : cdrom
Passwort (verschlüsselt) : x
Gruppennummer : 24
Mitglieder dieser Gruppe :
Name : tot
Name : hal
you@host > ./groupname dialout
Folgende Angaben wurden zu dialout ermittelt:
Gruppenname : dialout
Passwort (verschlüsselt) : x
Gruppennummer : 20
Mitglieder dieser Gruppe :
Name : tot
Name : cupsys
6.3.3 getgrent, setgrent und endgrent – alle Einträge in /etc/group abfragen
Natürlich gibt es auch hier, wie schon bei den Dateien /etc/passwd und /etc/shadow, eine Funktion, um alle Einträge nacheinander aus der Gruppendatei /etc/group zu erfragen.
#include <grp.h>
#include <sys/types.h>
struct group *getgrent(void);
void setgrent(void);
void endgrent(void);
Alle diese Funktionen machen schon dasselbe wie die Gegenstücke für die /etc/passwd- und /etc/shadow-Datei, nur dass sich diese eben auf die Datei /etc/group beziehen.
Die Funktion getgrent() liefert einen Zeiger auf einen Struktur group zurück, welche die Gruppeninformationen aus /etc/group enthält. Beim ersten Aufruf wird der erste Eintrag der Datei /etc/group zurückgegeben. Bei jedem weiteren Aufruf erfolgt der jeweils nächste Eintrag. Mit setgrent() können Sie wieder den Dateizeiger auf den Anfang der Datei /etc/group zurücksetzen. Mit der Funktion endgrent() schließen Sie die Datei /etc/group wieder.
Ein Beispiel kann ich mir hierzu ersparen, da die Vorgehensweise immer dieselbe ist, wie dies jetzt schon mehrmals, nur eben mit anderen Funktionen und Dateien, demonstriert wurde.
|