další předchozí obsah
Další: Prostředí procesů Předchozí: Soubory a adresáře

  Systémové soubory a informace





Úvod

V unixu je několik základních souborů nutných pro běh systému: soubor hesel /etc/passwd a soubor skupin /etc/group. Tyto soubory jsou často používány ostatními programy. Např. soubor hesel je použit při každém přihlášení uživatele nebo při spuštění příkazu ls -l.



Soubor obsahující hesla

POSIX.1 definuje soubor nazývaný databáze uživatelů, který obsahuje následující informace -- viz tab. 11

 

Popis struct passwd POSIX.1
uživatelské jméno char *pw_name o
šifrované heslo char *pw_passwd
user ID uid_t pw_uid o
group ID gid_t pw_gid o
komentář char *pw_gecos
počáteční pracovní adresář char *pw_dir o
počáteční shell (či jakýkoli program) char *pw_shell o
Tabulka 11: Položky v souboru /etc/passwd

Historicky jsou tyto informace uloženy v ASCII souboru /etc/passwd. Příklad tohoto souboru můžete nalézt v kap. "Přihlášení do systému".

POSIX.1 definuje pouze dvě operace nad těmito záznamy. První funkce vyhledá položku podle UID a druhá podle uživatelského jména.

#include <sys/types.h>
#include <pwd.h>
struct passwd *getpwuid (uid_t uid);
struct passwd *getpwnam (const char name);
Obě vrací: ukazatel když OK, NULL při chybě

Tyto funkce však vrátí jen jeden záznam. Pro procházení celého souboru slouží následující funkce.

#include <sys/types.h>
#include <pwd.h>
void setpwent(void);
void endpwent(void);
struct passwd *getpwent (void);
Vrací: ukazatel když OK, NULL při chybě

getpwent vrátí další položku v pořadí a ostatní funkce slouží jen k otevření a uzavření souboru. Vše je nejlépe patrné na příkladu.

Příklad:

#include <sys/types.h>
#include <pwd.h>
#include <stddef.h>
#include <string.h>

struct passwd *
getpwnam(const char *name)
{
    struct passwd  *ptr;

    setpwent();
    while ( (ptr = getpwent()) != NULL) {
        if (strcmp(name, ptr->pw_name) == 0)
            break;        /* found a match */
    }
    endpwent();
    return(ptr);    /* ptr is NULL if no match found */
}



Soubor se skupinami

Informace o skupinách lze nalézt v souboru se skupinami, který POSIX nazývá databáze skupin. Tento soubor obsahuje položky vypsané v tabulce 12.

 

Popis struct group POSIX.1
jméno skupiny char *gr_name o
šifrované heslo char *gr_passwd
group ID gid_t gr_gid o
pole ukazatelů na jména uživatelů char **gr_mem o
Tabulka 12: Položky v souboru /etc/group

Pole uživatelů je ukončeno NULL. V tomto souboru opět můžeme vyhledávat pomocí dvojice funkcí.

#include <sys/types.h>
#include <grp.h>
struct group *getgrgid (gid_t gid);
struct group *getgrnam (const char name);
Obě vrací: ukazatel když OK, NULL při chybě

Tyto funkce však vrátí jen jeden záznam. Pro procházení celého souboru slouží následující funkce.

#include <sys/types.h>
#include <grp.h>
void setgrent(void);
void endgrent(void);
struct group *getgrent (void);
Vrací: ukazatel když OK, NULL při chybě



Identifikace systému

POSIX.1 poskytuje funkce pro identifikaci hostitelského počítače a operačního systému:

#include <sys/utsname.h>
int uname (struct utsname *name);
Vrací: nezáporné číslo když OK, -1 při chybě

Funkce vyplní danou strukturu. Ta má následující tvar:

struct utsname {
  char  sysname[9];    /* název operačního systému */
  char  nodename[9];   /* název uzlu */
  char  release[9];    /* release operačního systému */
  char  version[9];    /* verze release */
  char  machine[9];    /* název typu hardware */
};



Cvičení

  1. Pomocí funkce crypt(3) napište program, který zjistí, jaké heslo bylo použito pro uživatele root v příkladu souboru /etc/passwd v kapitole ??, víte-li, že heslo je jednoznakové.


další předchozí obsah
Další: Prostředí procesů Předchozí: Soubory a adresáře

Ladislav Dobias
Sat Nov 1 15:38:32 MET 1997