Шрифт:
Интервал:
Закладка:
Права доступа к файлу могут быть изменены с помощью системных вызовов chmod(2) и fchmod(2):
#include <sys/types.h>
#include <sys/stat.h>
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 <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
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");
}
В результате запуска программы на выполнение, получим следующий вывод:
$ <b>a.out</b>
-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 — относительным, при котором фактическое расположение файла в файловой системе зависит от текущего каталога.
- Монетизация сайта. Секреты больших денег в Интернете - Андрей Меркулов - Интернет
- Info-драйвер. Как выжить в мире информации - Евгений Коноплев - Интернет
- Интернет-маркетинг без бюджета. Как продвигать, если денег нет или их мало - Александр Горенюк - Интернет
- HTML5 для веб-дизайнеров - Кит Джереми - Интернет
- Сетевые сообщества и обучение - Евгений Патаракин - Интернет
- Wi-Fi: Все, что Вы хотели знать, но боялись спросить - А. Щербаков - Интернет
- Лайкни меня! Экономика благодарности - Гари Вайнерчук - Интернет
- Как заработать в Интернете. 35 самых быстрых способов - Ольга Фомина - Интернет
- Веб-Самоделкин. Как самому создать сайт быстро и профессионально - Алексей Гладкий - Интернет
- 999 способов увеличения ваших продаж: в Интернете и не только - Иван Севостьянов - Интернет