Книга: Linux программирование в примерах
11.7. Работа со всеми тремя ID: getresuid() и setresuid() (Linux)
11.7. Работа со всеми тремя ID: getresuid()
и setresuid()
(Linux)
Linux предоставляет дополнительные системные вызовы, посредством которых вы можете непосредственно работать с действительными, эффективными и сохраненными ID пользователя и группы:
#include <sys/types.h> /* Linux */
#include <unistd.h>
int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid);
int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid);
int setresuid(uid_t ruid, uid_t euid, uid_t suid);
int setresgid(gid_t rgid, gid_t egid, gid_t sgid);
Функции следующие:
int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid)
Получает значения действительного, эффективного и сохраненного set-user ID. Возвращаемое значение 0 в случае успеха и -1 при ошибке, errno
указывает проблему.
int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid)
Получает значения действительного, эффективного и сохраненного set-group ID. Возвращаемое значение 0 в случае успеха и -1 при ошибке, errno
обозначает проблему.
int setresuid(uid_t ruid, uid_t euid, uid_t suid)
Устанавливает значения действительного, эффективного и сохраненного set-user ID соответственно. Когда значение параметра равно -1, соответствующий UID остается без изменения.
Когда процесс действует как root
, параметрами могут быть любые произвольные значения. Однако, использование ненулевого значения для euid
вызывает постоянную, безвозвратную утерю привилегии root
). В противном случае параметры должны быть одним из значений действительного, эффективного или сохраненного set-user ID.
int setresgid(gid_t rgid, gid_t egid, gid_t sgid)
Устанавливает значения действительного, эффективного и сохраненного set-group ID соответственно. Когда значение параметра равно -1, соответствующий GID остается без изменений.
Эта функция аналогична setresuid()
.
Функции setresuid()
и setresgid()
особенно ценны, поскольку их семантика ясно определена. Программист точно знает, каким может быть результат их вызова.
Более того, вызовы являются операциями типа «все или ничего»: они либо полностью успешны в осуществлении нужного изменения, либо терпят полную неудачу, оставляя текущее состояние как есть. Это повышает надежность, поскольку, опять-таки можно быть точно уверенным в том, что случилось.
- 11.1. Проверка прав доступа
- 11.2. Получение ID пользователя и группы
- 11.3. Проверка для действительного пользователя: access()
- 11.4. Проверка для эффективного пользователя: euidaccess() (GLIBC)
- 11.5. Установка дополнительных битов доступа для каталогов
- 11.6. Установка действительных и эффективных ID
- 11.7. Работа со всеми тремя ID: getresuid() и setresuid() (Linux)
- 11.8. Пересечение минного поля безопасности: setuid root
- 11.9. Рекомендуемая литература
- 11.10. Резюме
- Упражнения
- Глава 11 Права доступа и ID пользователей и групп
- 11.4. Проверка для эффективного пользователя: euidaccess() (GLIBC)
- Практическая работа 53. Запуск Access. Работа с объектами базы данных
- InterBase Classic Server под Linux
- Каталог BIN в InterBase Classic Server для Linux
- Лекция 15. Работа с базами данных
- Работа с ресурсами локальной сети
- Эффективная работа с временными файлами сортировки
- Ускоренная работа с индексами
- HR-брендинг: Работа с поколением Y, новые инструменты для коммуникации, развитие корпоративной культуры и еще 9 эффектив...
- Безопасная работа с внешними таблицами
- Работа со строками