• Написание приложений setuid-root
не является задачей для новичка. Если вам нужно сделать такую вещь, сначала специально изучите проблемы безопасности. Для этого можно воспользоваться приведенными выше превосходными источниками.
Упражнения
1. Напишите простую версию команды id
. Ее назначением является отображение в стандартный вывод ID пользователя и группы с указанием имен групп. Когда эффективный и действительный ID различаются, выводятся оба. Например:
$ id
uid=2076(arnold) gid=42(devel) groups=19(floppy), 42(devel), 2076(arnold)
Ее использование:
id [
id -G [ -nr ] [
id -g [ -nr ] [
id -u [ -nr ] [
При указанном id
выводит сведения о пользователе, вызвавшем программу. Опции следующие:
-G
Выводит все значения групп в виде чисел, без имен.
-n
Выводит лишь имена, без числовых значений. Применяется с значениями пользователя и группы.
-g
Выводит лишь эффективный GID.
-u
Выводит лишь эффективный UID.
2. Напишите простую программу с именем sume
и установите setuid на себя. Она должна запрашивать пароль (см. sume
должна выполнить exec оболочки. Попросите другого пользователя помочь вам ее протестировать.
3. Как вы относитесь к тому, чтобы сделать sume
доступной для ваших друзей? Для ваших приятелей студентов или сотрудников? Для каждого пользователя на вашей системе?
Глава 12 Общие библиотечные интерфейсы — часть 2
В главе 6, «Общие библиотечные интерфейсы — часть 1», был представлен первый набор API библиотеки общего пользования. В некотором смысле, эти API поддерживают работу с фундаментальными объектами, которыми управляют системы Linux и Unix: время дня, пользователи и группы для файлов, сортировка и поиск.
Данная глава более эклектична; функции API, рассмотренные здесь, не особо связаны друг с другом. Однако, все они полезны в повседневном программировании под Linux/Unix. Наше представление движется от простых, более общих функций API к более сложным и более специализированным.
12.1. Операторы проверки: assert()
Операторы проверки особенно полезны для описания двух разновидностей инвариантов:
/* lsearch --- возвратить индекс с данным значением в массиве или -1,
если не найдено */
int lsearch(int *array, size_t size, int value) {
size_t i;
/* предусловие: array != NULL */
/* предусловие: size > 0 */
for (i = 0; i < size; i++)
if (array[i] == value)
return i;
/* постусловие: i == size */
return -1;
}
Этот пример определяет условия, используя комментарии. Но не было бы лучше проверить условия с использованием кода? Это является задачей макроса assert()
:
#include
void assert(/*
Когда assert()
выводит диагностическое сообщение и завершает программу (с помощью функции abort()
; см. раздел 12.4 «Совершение самоубийства: abort()
»). ch12-assert.c
снова предоставляет функцию lsearch()
, на этот раз с оператором проверки и функцией main()
:
1 /* ch12-assert.с --- демонстрация операторов проверки */
2
3 #include
4 #include
5