table of contents
CHROOT(2) | Руководство программиста Linux | CHROOT(2) |
ИМЯ¶
chroot - изменить корневой каталог
ОБЗОР¶
#include <unistd.h>
int chroot(const char *path);
Требования
макроса
тестирования
свойств
для glibc (см.
feature_test_macros(7)):
chroot():
- Начиная с glibc 2.2.2:
-
_BSD_SOURCE ||
(_XOPEN_SOURCE >= 500 ||
_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) &&
!(_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) -
До glibc 2.2.2: не было
ОПИСАНИЕ¶
chroot() изменяет корневой каталог вызывающего процесса на тот, что задан аргументом path. Этот каталог будет использоваться для имён файлов, начинающихся с /. Корневой каталог наследуется всеми потомками вызывающего процесса.
Только привилегированный процесс (Linux: с мандатом CAP_SYS_CHROOT) может вызвать chroot().
Этот вызов изменяет только составляющую процесса разрешения имён и больше ничего.
Данный вызов не изменяет текущий рабочий каталог, поэтому после вызова '.' может оказаться вне дерева, являющегося корнем '/'. В частности, суперпользователь может выйти за пределы "тюрьмы chroot" выполнив:
mkdir foo; chroot foo; cd ..
Данный вызов не закрывает открытые файловые дескрипторы и поэтому через такие дескрипторы можно получить доступ к файлам за пределами дерева chroot.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.
ОШИБКИ¶
В зависимости от файловой системы могут быть возвращены другие ошибки. Наиболее распространённые ошибки перечислены далее:
- EACCES
- Поиск запрещён из-за одного из частей префикса пути (См. также path_resolution(7).)
- EFAULT
- Аргумент path указывает за пределы доступного адресного пространства.
- EIO
- Произошла ошибка ввода-вывода.
- ELOOP
- Во время определения path встретилось слишком много символьных ссылок.
- ENAMETOOLONG
- path слишком длинен.
- ENOENT
- Файл не существует.
- ENOMEM
- Недостаточное количество памяти ядра.
- ENOTDIR
- Компонент path не является каталогом.
- EPERM
- У вызвавшего процесса недостаточно прав.
СООТВЕТСТВИЕ СТАНДАРТАМ¶
SVr4, 4.4BSD, SUSv2 (отмечена как УСТАРЕВШАЯ). Эта функция не входит в POSIX.1-2001.
ЗАМЕЧАНИЯ¶
Дочерний процесс, созданный посредством fork(2), наследует корневой каталог родительского процесса. При вызове execve(2) корневой каталог остаётся неизменным.
В FreeBSD есть более ограничивающий системный вызов jail().
СМОТРИТЕ ТАКЖЕ¶
2010-09-20 | Linux |