Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² срСдС Linux. Π’Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 136

Автор Майкл ДТонсон

Ѐункция dlclose() Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ.

void * dlclose(void * handle);

Ѐункция dlclose() провСряСт счСтчик ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ увСличивался Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dlopen(), ΠΈ Ссли ΠΎΠ½ Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ, ΠΎΠ½Π° Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ. Π­Ρ‚ΠΎΡ‚ счСтчик ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ позволяСт Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dlopen() ΠΈ dlclose() для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π½Π΅ бСспокоясь ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ производится Π²Ρ‹Π·ΠΎΠ², ΡƒΠΆΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π» ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΠΈΠ· этих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

27.1.1. ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π’ Π³Π»Π°Π²Π΅ 8 Π±Ρ‹Π» прСдставлСн ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ раздСляСмой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ libhello.so, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π°ΠΌ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π²ΠΎ врСмя выполнСния. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° loadhello Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ libhello.so динамичСски ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ print_hello, которая находится Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅.

НиТС показан код loadhello.с.

 1: /* loadhello.с */

 2:

 3: #include <dlfcn.h>

 4: #include <stdio.h>

 5: #include <stdlib.h >

 6:

 7: typedef void (*hello_function) (void);

 8:

 9: int main(void) {

10:  void * library;

11:  hello_function hello;

12:  const char * error;

13:

14:  library = dlopen("libhello.so", RTLD_LAZY);

15:  if (library == NULL) {

16:   fprintf (stderr, "He удаСтся ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ libhello.so: %s\n",

17:    dlerror());

18:   exit(1);

19:  }

20:

21:  /* Π₯отя Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ символ print_hello Π½ΠΈΠΊΠΎΠ³Π΄Π°

22:   * Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π΅Π½ NULL, ΠΏΡ€ΠΈ поискС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… символов

23:   * всС происходит ΠΈΠ½Π°Ρ‡Π΅. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ вмСсто ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dlsym()

24:   * ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ΄Π°, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ dlerror().

25:   */

26:  dlerror();

27:  hello = dlsym(library, "print_hello");

28:  error = dlerror();

29:  if (error) {

30:   fprintf(stderr, "He удаСтся Π½Π°ΠΉΡ‚ΠΈ print_hello: %s\n", error);

31:   exit(1);

32:  }

33:

34:  (*hello)();

35:  dlclose(library);

36:  return 0;

37: }

Π“Π»Π°Π²Π° 28

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ ΠΈ аутСнтификация ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

Π’ ΠΌΠΎΠ΄Π΅Π»ΠΈ бСзопасности Linux для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ Π³Ρ€ΡƒΠΏΠΏ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ числа, ΠΎΠ΄Π½Π°ΠΊΠΎ люди ΠΎΡ‚Π΄Π°ΡŽΡ‚ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½Π°ΠΌ. ИмСна, наряду с Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²Π°ΠΆΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ, ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² Π΄Π²ΡƒΡ… систСмных Π±Π°Π·Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

28.1. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Π² имя

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ls -l для Π²Ρ‹Π²ΠΎΠ΄Π° списка содСрТимого Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ ΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°Ρ… ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ (ID) ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Π°ΠΉΠ». Π­Ρ‚ΠΎΡ‚ список выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

drwxrwxr-x  5 christid christid 1024 Aug 15 02:30 christid

drwxr-xr-x 73 johnsonm root     4096 Jan 18 12:48 johnsonm

drwxr-xr-x 25 kim      root     2048 Jan 12 21:13 kim

drwxrwsr-x  2 tytso    tytso    1024 Jan 30  1996 tytso

Однако Π½ΠΈΠ³Π΄Π΅ Π² ядрС Π½Π΅ хранится строка christid. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ls осущСствляСт ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ², прСдоставлСнных ядром, Π² ΠΈΠΌΠ΅Π½Π°. Она ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€Π° ΠΈΠ· систСмного Π²Ρ‹Π·ΠΎΠ²Π° stat() ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ поиск ΠΈΠΌΠ΅Π½ Π² Π΄Π²ΡƒΡ… систСмных Π±Π°Π·Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ эти Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… хранятся Π² Ρ„Π°ΠΉΠ»Π°Ρ… /etc/passwd ΠΈ /etc/group, хотя Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… систСмах информация ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π³Π΄Π΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π² сСти ΠΈΠ»ΠΈ Π² ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌ нСстандартном мСстС. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ Ρ‚ΠΎΠΌ, Π³Π΄Π΅ хранится эта информация; Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π‘ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΎΠ±ΠΎΠ±Ρ‰Ρ‘Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ для опрСдСлСния мСста хранСния этой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, производят Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π΅Π΅ Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ для вас.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ls ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΈΠ· ядра, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ls -ln.

drwxrwxr-x  5 500  500  1024 Aug 15 02:30 christid

drwxr-xr-x 73 100  0    4096 Jan 18 12:48 johnsonm

drwxr-xr-x 25 101  0    2048 Jan 12 21:13 kim

drwxrwsr-x  2 1008 1008 1024 Jan 30 1996  tytso

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π°, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ элСмСнты Π² /etc/passwd (ΠΈΠ»ΠΈ эквивалСнтной Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… систСмы), ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² <pwd.h>.

struct passwd {

char * pw_name;    /* Имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ */

 char * pw_passwd; /* ΠŸΠ°Ρ€ΠΎΠ»ΡŒ */

 __uid_t pw_uid;   /* Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ */

 __gid_t pw_gid;   /* Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π³Ρ€ΡƒΠΏΠΏΡ‹ */

 char * pw_gecos;  /* НастоящСС имя */

 char * pw_dir;    /* Π”ΠΎΠΌΠ°ΡˆΠ½ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ */

 char * pw_shell;  /* ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° shell */

};

β€’ pw_name прСдставляСт ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

β€’ pw_passwd ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΈΠ»ΠΈ Π½Π΅Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅, связанноС с ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Зависит ΠΎΡ‚ систСмы.

β€’ pw_uid прСдставляСт Π½ΠΎΠΌΠ΅Ρ€ (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ядрС для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

β€’ pw_gid прСдставляСт Π³Π»Π°Π²Π½ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ядро связываСт с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ.

β€’ pw_gecos прСдставляСт Ρ‡Π»Π΅Π½, зависящий ΠΎΡ‚ систСмы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ сюда Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ настоящСС имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ; Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… систСмах здСсь приводится список Ρ‡Π»Π΅Π½ΠΎΠ², Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… запятыми, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€Π° Π΄ΠΎΠΌΠ°ΡˆΠ½ΠΈΡ… ΠΈ Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ΠΎΠ².

β€’ pw_dir прСдставляСт домашний ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, связанный с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ. ΠžΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ сСансы рСгистрации Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с этим ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ Π² качСствС Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°.

β€’ pw_shell прСдставляСт имя ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, которая запускаСтся Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ рСгистрации ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Бюда ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ относятся /bin/bash, /bin/tcsh, bin/zsh ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Однако элСмСнты, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ, ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, /bin/false примСняСтся для элСмСнтов passwd, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для рСгистрации ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ часто слуТат для Ρ†Π΅Π»Π΅ΠΉ, рассмотрСниС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ настоящСй ΠΊΠ½ΠΈΠ³ΠΈ.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π°, которая прСдставляСт элСмСнты Π² /etc/group (ΠΈΠ»ΠΈ Π² эквивалСнтных Π±Π°Π·Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…), ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² <grp.h>.

struct group {

 char * gr_name;   /* Имя Π³Ρ€ΡƒΠΏΠΏΡ‹ */

 char * gr_passwd; /* ΠŸΠ°Ρ€ΠΎΠ»ΡŒ */

 __gid_t gr_gid;   /* Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π³Ρ€ΡƒΠΏΠΏΡ‹ */

 char ** gr_mem;   /* Бписок Ρ‡Π»Π΅Π½ΠΎΠ² */

};

β€’ gr_name прСдставляСт ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ имя Π³Ρ€ΡƒΠΏΠΏΡ‹.

β€’ gr_passwd прСдставляСт ΠΏΠ°Ρ€ΠΎΠ»ΡŒ (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ). К Π½Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ Ρ‚Π΅ ΠΆΠ΅ трСбования, Ρ‡Ρ‚ΠΎ ΠΈ ΠΊ pw_passwd, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π΅Ρ‰Π΅ большСй стСпСни.

β€’ gr_gid прСдставляСт Π½ΠΎΠΌΠ΅Ρ€ (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ядро ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹.

β€’ gr_mem прСдставляСт список Ρ‡Π»Π΅Π½ΠΎΠ² Π³Ρ€ΡƒΠΏΠΏΡ‹, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… запятыми. Π­Ρ‚ΠΎ список ΠΈΠΌΠ΅Π½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ этой Π³Ρ€ΡƒΠΏΠΏΠ΅ Π½Π° Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½ΠΎΠΉ основС (см. Π³Π»Π°Π²Ρƒ 10).

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π΅ ΠΎΠ±Ρ‰ΠΈΡ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ производится доступ ΠΊ систСмным ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…: Ссли ядро ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€, Π° Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ имя, ΠΈΠ»ΠΈ Ссли ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ»ΠΈ какая-Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π²Π°ΠΌ имя, Π° Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ядру Π½ΠΎΠΌΠ΅Ρ€. ΠŸΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½Ρ‹ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ поиска числовых ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², getpwuid() ΠΈ getgrgid(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ цСлочислСнный ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° структуру, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ систСмной Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ производят поиск ΠΈΠΌΠ΅Π½, getpwnam() ΠΈ getgrnam(), ΠΈ ΠΎΠ½ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Ρ‚Π΅ ΠΆΠ΅ Π΄Π²Π΅ структуры.

Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… Π³Ρ€ΡƒΠΏΠΏ НомСр getpwuid() getgrgid() Имя getpwnam() getgrnam()

КаТдая ΠΈΠ· этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° структуры. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ статичСскими ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, поэтому Ссли Π²Π°ΠΌ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΡΠ»ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ структуру, потрСбуСтся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π΅ копию.

Π§Π΅Ρ‚Ρ‹Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ, ΠΏΠΎ сути, сокращСниями, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‰ΠΈΠΌΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для доступа ΠΊ систСмным Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня, getpwent() ΠΈ getgrent(), производят ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ строкам Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… вмСсто поиска ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ записи. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ элСмСнт ΠΈΠ· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ систСмной Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π΅Π³ΠΎ. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π²Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚Π΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ элСмСнтов, Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ endpwent() ΠΈΠ»ΠΈ endgrent(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ».

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π΄Π°Π»Π΅Π΅ приводится функция getpwuid(), записанная Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getpwent().

struct passwd * getpwuid(uid_t uid) {

 struct passwd * pw;

 while (pw = getpwent()) {

  if (!pw)