Операционная система UNIX - страница 64
и fchmod(2):
>#include
>#include
>int chmod(const char *path, mode_t mode);
>int fchmod(int fildes, mode_t mode);
Значение аргумента mode определяет устанавливаемые права доступа и дополнительные атрибуты (такие как SUID, SGID и Sticky bit), и создается путем логического объединения различных флагов, представленных в табл. 2.14. Вторая колонка таблицы содержит восьмеричные значения для девяти битов прав доступа (чтение, запись и выполнение для трех классов доступа) и трех битов дополнительных атрибутов.
Таблица 2.14. Флаги аргумента mode
Флаг | Биты | Значение |
---|---|---|
>S_ISUID | >04000 | Установить бит SUID |
>S_ISGID | >020#0 | Установить бит SGID, если # равно 7, 5, 3 или 1. Установить обязательное блокирование файла, если # равно 6, 4, 2 или 0 |
>S_ISVTX | >01000 | Установить Sticky bit |
>S_IRWXU | >00700 | Установить право на чтение, запись и выполнение для владельца-пользователя |
>S_IRUSR | >00400 | Установить право на чтение для владельца-пользователя |
>S_IWUSR | >00200 | Установить право на запись для владельца-пользователя |
>S_IXUSR | >00100 | Установить право на выполнение для владельца-пользователя |
>S_IRWXG | >00070 | Установить право на чтение, запись и выполнение для владельца-группы |
>S_IRGRP | >00040 | Установить право на чтение для владельца-группы |
>S_IWGRP | >00020 | Установить право на запись для владельца-группы |
>S_IXGRP | >00010 | Установить право на выполнение для владельца-группы |
>S_IRWXO | >00007 | Установить право на чтение, запись и выполнение для остальных пользователей |
>S_IROTH | >00004 | Установить право на чтение для остальных пользователей |
>S_IWOTH | >00002 | Установить право на запись для остальных пользователей |
>S_IXOTH | >00001 | Установить право на выполнение для остальных пользователей |
Некоторые флаги, представленные в таблице, уже являются объединением нескольких флагов. Так, например, флаг >S_RWXU
эквивалентен >S_IRUSR | S_IWUSR | S_IXUSR
. Значение флага S_ISGID зависит от того, установлено или нет право на выполнение для группы (S_IXGRP). В первом случае, он будет означать установку SGID, а во втором — обязательное блокирование файла.
Для иллюстрации приведем небольшую программу, создающую файл с полными правами доступа для владельца, а затем изменяющую их. После каждой установки прав доступа в программе вызывается библиотечная функция system(3S), позволяющая запустить утилиту ls(1) и отобразить изменение прав доступа и дополнительных атрибутов.
>#include
>#include
>#include
>main() {
> int fd;
> /* Создадим файл с правами rwx------ */
> fd = creat("my_file", S_IRUSR | S_IWUSR | S_IXUSR);
> system("ls -l my_file");
> /*Добавим флаг SUID */
> fchmod(fd, S_IRWXU | S_ISUID);
> /* Установим блокирование записей файла */
> fchmod(fd, S_IRWXU | S_ISUID | S_ISGID);
> system("ls -l my_file");
> /* Теперь установим флаг SGID */
> fchmod(fd, S_IRWXU | S_ISUID | S_ISGID | S_IXGRP);
> system("ls -l my_file");
>}
В результате запуска программы на выполнение, получим следующий вывод:
>$ a.out
>-rwx------ 1 andy user 0 Jan 6 19:28 my_file
>-rws------ 1 andy user 0 Jan 6 19:28 my_file
>-rws--1--- 1 andy user 0 Jan 6 19:28 my_file
>-rws--s--- 1 andy user 0 Jan 6 19:28 my_file
Перемещение по файловой системе
Каждый процесс имеет два атрибута, связанных с файловой системой — корневой каталог (root directory) и текущий рабочий каталог (current working directory). Когда некоторый файл адресуется по имени (например, в системных вызовах open(2), creat(2) или readlink(2)), ядро системы производит поиск файла, начиная с корневого каталога, если имя файла задано как абсолютное, либо текущего каталога, если имя файла является относительным. Абсолютное имя файла начинается с символа '/', обозначающего корневой каталог. Все остальные имена файлов являются относительными. Например, имя /usr/bin/sh является абсолютным, в то время как mydir/test1.c или ../andy/mydir/test1.c — относительным, при котором фактическое расположение файла в файловой системе зависит от текущего каталога.
Процесс может изменить свой корневой каталог с помощью системного вызова chroot(2) или fchroot(2).
>#include
>int chroot (const char *path);
>int fchroot(int fildes);
После этого поиск всех адресуемых файлов с абсолютными именами будет производиться, начиная с нового каталога, указанного аргументом