П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 175057 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 72048 раз(а).

Учебник HTML.
Просмотров 72106 раз(а).

Руководство по PHP5.
Просмотров 42727 раз(а).

Хостинг через призму DNS.
Просмотров 49221 раз(а).

Подборка текстов стандартных документов.
Просмотров 43145 раз(а).

Учебник PHP - Самоучитель
Просмотров 49487 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 49749 раз(а).

Внешние атаки...
Просмотров 40275 раз(а).

Учебник PHP.
Просмотров 35309 раз(а).

SSI в примерах.
Просмотров 26581 раз(а).



 
 
| Добавить в избранное | Сделать стартовой | Помощь




Глава 16: Доступ к системным базам данных.
16.1 Получение информации о паролях и группах

Информация о вашем пользовательском имени и идентификаторе, кото-рая имеется в системе UNIX, практически открыта. По сути дела, любая программа, которая не сочтет за труд заглянуть в файл /etc/passwd, поможет вам увидеть почти все, кроме незашифрованного пароля. Этот файл имеет особый формат, определяемый в passwd(5), и выглядит приблизительно так:

name:passwd:uid:gid:gcos:dir:shell

Поля определены следующим образом:

  • name - Регистрационное имя пользователя
  • passwd - Зашифрованими пароль или что-нибудь простое, если используется теневой файл паролей
  • uid - Идентификатор пользователя (для пользователя root — 0, для обычных пользователей — ненулевое число)
  • gid - Регистрационная группа по умолчанию (группа 0 может быть привиле-гированной, но не обязательно)
  • gcos - Как правило, содержит полное имя пользователя, за которым через запятую следует и другая информация
  • dir - Начальний каталог (каталог, в который вы переходите, когда даете команду cd без аргументов, и в котором хранится большинство ваших файлов, имена которых начинаются с точки)
  • shell - Ваш регистрационный shell, как правило, /bin/sh или /bin/csh (а, может быть, даже /usr/bin/perl, если вы большой оригинал)

Типичные элементы файла паролей выглядят так:

fred:*:123:15:Fred Flintstone,,,:/home/fred:/bin/csh 
barney:*:125:15:Barney Rubble,,,:/home/barney:/bin/csh

Сейчас в Perl достаточно инструментов для того, чтобы можно было легко выполнить разбор такой строки (например, с помощью функции split), не прибегая к специальным программам. Тем не менее в библиотеке UNIX все же есть набор специальных программ: getpwent(3), getpwuid(3), gelpwnam(3) и т.д. Эти программы доступны в Perl под теми же именами, с похожими аргументами и возвращаемыми значениями.

Например, программа getpwnam в Perl становится функцией getpwnam. Ее единственный аргумент — пользовательское имя (например, fred или barney), а возвращаемое значение — строка файла /etc/passwd, преобразованная в массив со следующими значениями:

($name, $passwd, $uid, $gid, $quota, $cominent, $gcos, $dir, $shell)

Обратите внимание: здесь несколько больше значений, чем в файле паролей. Обычно в UNIX-системах, по крайней мере в тех, которые мы видели, поле $quota всегда пусто, а поля $comment и $gcos часто оба содержат персональную информацию о пользователе (поле GCOS). Так, для старины Фреда мы получаем

("fred","*",123,15,"","Fred Flintstone,,,","Fred Flintstone,,,","/home/gred","/bin/csh")

посредством любого из следующих вызовов:

getpwuid(123) getpwnam("fred")

Отметим, что в качестве аргумента функция getpwuid принимает идентификатор пользователя, a getpwnam — регистрационное имя.

При вызове в скалярном контексте функции getpwnam и getpwuid также имеют возвращаемое значение — данные, которые вы запросили с их помощью. Например:

$idnum = getpwuid("daemon");
$1ogin = getpwnam (25);

Возможно, вам захочется получить эти результаты по отдельности, используя некоторые из уже знакомых вам операций, проводимых над списками. Один способ — получить часть списка, используя для этого срез списка, например получить для Фреда только начальний каталог:

($fred home) = (getpwnam ("fred"))[7]; # начальний каталог Фреда

Как просмотреть весь файл паролей? Для этого можно было бы поступить, к примеру, так:

for($id = 0; $id <= 10_000; $id++) {
 @stuff = getpwuid $id;
} ### не рекомендуется!

Это, однако, неверный путь. Наличие нескольких способов само по себе еще не означает, что все они в равной степени эффективны.

Функции getpwuid и getpwnam можно считать функциями произвольного доступа; они извлекают конкретний элемент по его ключу, поэтому для начала у вас должен быть ключ. Другой метод доступа к файлу паролей — последовательный, т.е. поочередное получение его записей.

Программами последовательного доступа к файлу паролей являются функции setpwent, getpwent и endpwent. В совокупности эти три функции выполняют последовательный проход по всем записям файла паролей. Функция setpwent инициализирует просмотр. После инициализации каждый вызов getpwent возвращает следующую запись файла паролей. Если данных для обработки больше нет, getpwent возвращает пустой список. Наконец, вызов endpwent освобождает ресурсы, используемне программой просмотра; это делается автоматически и при выходе из программы.

Приведенное описание может сказаться не совсем понятным без примера, поэтому дадим его:

setpwent (); # инициализировать просмотр
while (@list " getpwent()) {   # выбрать следующий элемент
  ($1ogin,$home) = @list[0,7]; # получить регистрационное имя 
                               # и начальний каталог
  print "Home directory for $1ogin is $home\n"; # сообщить это  
} endpwent(); # все сделано

Эта программа сообщает имена начальних каталогов всех пользователей, перечисленные в файле паролей. А если вы хотите расставить начальные каталоги в алфавитном порядке? В предыдущей главе мы изучили функцию sort, давайте воспользуемся ею:

setpwentf); # инициализировать просмотр
while (@list = getpwentO) { # вибрать следующий элемент
  ($1ogin,$home) = @list[0,7]; # получить регистрационное имя 
                               # и начальний каталог
  $home($1ogin} = $home; # сохранить их 
}
endpwent(); # все сделано 

Skeys = sort ( $home($a( cmp $home($b) } keys %home;
foreach $1ogin (Skeys) { # пройти по рассортированным именам
  print "home of $1ogin is $home($1ogin)\n";
}

Этот несколько более длинный фрагмент иллюстрирует важную особенность последовательного просмотра файла паролей: вы можете сохранять соответствующие фрагменты данных в структурах данных, выбираемых по своему усмотрению. Первая часть примера — это код просмотра всего файла паролей с созданием хеша, в котором ключ — регистрационное имя, а значение — начальний каталог, соответствующий этому регистрационному имени. Строка sort получает ключи хеша и сортирует их в соответствии со строковым значением. Завершающий цикл — это проход по рассортированным ключам и поочередный вывод всех значений.

В общем случае для просмотра небольшого количества значений рекомендуется использовать программы произвольного доступа (getpwuid и getpwnam). Если значений много или необходим просмотр всех значений, проще выполнить проход с последовательним доступом (с помощью функций setpwent, getpwent и endpwent) и помостить конкретные значения, которые вы будете искать, в хеш*.

Доступ к файлу /etc/group осуществляется аналогичным образом. Последовательный доступ обеспечивается вызовами функций setgrent, getgrent и endgrent. Вызов getgrent возвращает значения в следующем формате:

<$name, $passwd, $gid, $members)

Эти четыре значения примерно соответствуют четырем полям файла /etc/group, поэтому за подробной информацией обращайтесь к описанням, приведенным на man-страницах, относящихся к формату этого файла. Соответствующие функций произвольного доступа — getgrgid (по идентификатору группы) и getgrnam (по имени группы).

* Если у вас узел с большой NIS-картой, то по соображениям производительности такой способ предобработки файла паролей лучше не использовать.

Назад | Вперед
Содержание (общее) | Содержание раздела



Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
 





Copyright © 2005-2016 Project.Net.Ru