Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
• Концепции сохраненных set-user ID и set-group ID пришли из System V и были приняты POSIX с полной поддержкой в GNU/Linux. Наличие этих отдельных значений ID дает возможность легко и безошибочно переключать при необходимости действительные и эффективные UID (и GID).
• Программы setuid и setgid создают процессы, в которых действительные и эффективные ID различаются. Программы как таковые помечаются дополнительными битами прав доступа к файлу. Биты setuid и setgid должны быть добавлены к файлу после его создания.
•
getuid()geteuid()getgid()getegid()getgroups()• Функция
access()stat()• Функция GLIBC
euidaccess()access()• «Липкий» бит и бит setgid при использовании с каталогами привносят дополнительную семантику. Когда для каталога установлен бит setgid, новые файлы в этом каталоге наследуют группу этого каталога. Новые каталоги делают то же самое, они также автоматически наследуют установку бита setgid. Без установленного бита setgid новые файлы и каталоги получают эффективный GID создающего их процесса. «Липкий» бит, установленный для каталогов, в которые в других отношениях разрешена запись, ограничивает право на удаление файла владельцем файла, владельцем каталога и
root• Набор групп изменяется с помощью
setgroups()root• Изменение UID и GID довольно сложно. Семантика различных системных вызовов с течением времени изменилась. Новые приложения, которые будут изменять лишь свои эффективные UID/GID, должны использовать
seteuid()setegid()rootsetuid()setgid()setreuid()setregid()• Приложения, действующие как
rootsetuid()setgid()loginroot• Функции Linux
setresuid()setresgid()• Написание приложений setuid-
rootУпражнения
1. Напишите простую версию команды
id$ <b>id</b>uid=2076(arnold) gid=42(devel) groups=19(floppy), 42(devel), 2076(arnold)Ее использование:
id [ <i>пользователь</i> ]id -G [ -nr ] [ <i>пользователь</i> ]id -g [ -nr ] [ <i>пользователь</i> ]id -u [ -nr ] [ <i>пользователь</i> ]При указанном пользователе выводятся сведения об этом пользователе; в противном случае
id -G -n -g -u 2. Напишите простую программу с именем
sumesume3. Как вы относитесь к тому, чтобы сделать
sumeГлава 12 Общие библиотечные интерфейсы — часть 2
В главе 6, «Общие библиотечные интерфейсы — часть 1», был представлен первый набор API библиотеки общего пользования. В некотором смысле, эти API поддерживают работу с фундаментальными объектами, которыми управляют системы Linux и Unix: время дня, пользователи и группы для файлов, сортировка и поиск.
Данная глава более эклектична; функции API, рассмотренные здесь, не особо связаны друг с другом. Однако, все они полезны в повседневном программировании под Linux/Unix. Наше представление движется от простых, более общих функций API к более сложным и более специализированным.
12.1. Операторы проверки:
assert()Оператор проверки (assertion) является утверждением, которое вы делаете о состоянии своей программы в определенный момент времени ее исполнения. Использование операторов проверок для программирования было первоначально разработано Хоаром (C.A.R. Hoare) [121]. Общая идея является частью «верификации программы»: так же, как вы проектируете и разрабатываете программу, вы можете показать, что она правильна, делая тщательно аргументированные утверждения о проявлениях кода вашей программы. Часто такие утверждения делаются об инвариантах — фактах о состоянии программы, которые, как предполагается, остаются верными на протяжении исполнения куска программы.