Анимация
JavaScript
|
Главная Библионтека Регистрационная группа по умолчанию (группа О может быть привилегированной, но не обязательно) gcos Как правило, содержит полное имя пользователя, за которым через запятую следует и другая информация Начальный каталог (каталог, в который вы переходите, когда даете команду 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 все же есть набор специальных программ: getpwentfS), getpwuid(3), getpwnam(3) и т.д. Эти программы доступны в Perl под теми же именами, с похожими аргументами и возвращаемыми значениями. Например, программа getpwnam в Perl становится функцией getpwnam. Ее единственный аргумент - пользовательское имя (например, fred или barney), а возвращаемое значение - строка файла /etc/passwd, преобразованная в массив со следующими значениями: ($name, $passwd, $uid, $gid, $quota, $coiranent, $gcos, $dir, $shell) Обратите внимание: здесь несколько больше значений, чем в файле паролей. Обычно в UNIX-системах, по крайней мере в тех, которые мы видели, поле $quota всегда пусто, а поля $ comment и $gcos часто оба содержат персональную информацию о пользователе (поле GCOS). Так, для старины Фреда мы получаем ("fred", "*", 123, 15, "", "Fred Flintstone,,,", "Fred Flintstone,,,", "/home/gred"," /bin/csh") посредством любого из следующих вызовов: getpwuid(123) getpwnam("fred") Отметим, что в качестве аргумента функция getpwuid принимает идентификатор пользователя, а getpwnam - регистрационное имя. При вызове в скалярном контексте функции getpwnam и getpwuid также имеют возвращаемое значение - данные, которые вы запросили с их помощью. Например: $idnum = getpwuid("daemon"); $login = getpwnam(25); Возможно, вам захочется получить эти результаты по отдельности, используя некоторые из уже знакомых вам операций, проводимых над списками. Один способ - получить часть списка, используя для этого срез списка, например получить для Фреда только начальный каталог: ($fred liome) = (getpwnam ("fred") ) [7] ; # начальный каталог Фреда Как просмотреть весь файл паролей? Для этого можно было бы поступить, к примеру, так: for($id = 0; $id <= 10 000; $id++) ( Sstuff = getpwuid $id; } ### не рекомендуется Это, однако, неверный путь. Наличие нескольких способов само по себе еще не означает, что все они в равной степени эффективны. Функции getpwuid И getpwnam можно считать функциями произвольного доступа; они извлекают конкретный элемент по его ключу, поэтому для начала у вас должен быть ключ. Другой метод доступа к файлу паролей - последовательный, т.е. поочередное получение его записей. Программами последовательного доступа к файлу паролей являются функции setpwent, getpwent И endpwent. В совокупности Эти три функции выполняют последовательный проход по всем записям файла паролей. Функция setpwent инициализирует просмотр. После инициализации каждый вызов getpwent возвращает следующую запись файла паролей. Если данных для обработки больще нет, getpwent возвращает пустой список. Наконец, вызов endpwent освобождает ресурсы, используемые программой просмотра; это делается автоматически и при выходе из программы. Приведенное описание может оказаться не совсем понятным без примера, поэтому дадим его: setpwent(); # инициализировать просмотр while ((list = getpwent О) f # выбрать следующий элемент ($login, $home) = (§list[0,7]; # получить регистрационное имя # и начальный каталог print "Home directory for $login is $home\n"; # сообщить это endpwent(); # все сделано Эта программа сообщает имена начальных каталогов всех пользователей, перечисленные в файле паролей. А если вы хотите расставить начальные каталоги в алфавитном порядке? В предьщущей главе мы изучили функцию sort, давайте воспользуемся ею: setpwentO; # инициализировать просмотр while (@list = getpwentO) ( # выбрать следующий элемент ($login,$horae) = @list[0,7]; # получить регистрационное имя # и начальный каталог $home{$login} = $home; # сохранить их endpwentO; # все сделано Okeys = sort ( $horae{$a} cmp $home($b} } keys %home; foreach $login (@keys) ( # пройти no рассортированным именам print "home of $login is $horae{$login)\n"; Этот несколько более длинный фрагмент иллюстрирует важную особенность последовательного просмотра файла паролей: вы можете сохранять соответствующие фрагменты данных в структурах данных, выбираемых по своему усмотрению. Первая часть примера - это код просмотра всего файла паролей с созданием хеща, в котором ключ - регистрационное имя, а значение - начальный каталог, соответствующий этому регистрационному имени. Строка sort получает ключи хеша и сортирует их в соответствии со строковым значением. Завершающий цикл - это проход по рассортированным ключам и поочередный вывод всех значений. В общем случае для просмотра небольшого количества значений рекомендуется использовать программы произвольного доступа (getpwuid и getpwnam). Если значений много или необходим просмотр всех значений, проще выполнить проход с последовательным доступом (с помощью функций setpwent, getpwent и endpwent) И поместить конкретные значения, которые вы будете искать, в хеш*. Доступ к файлу /etc/group осуществляется аналогичным образом. Последовательный доступ обеспечивается вызовами функций setgrent, getgrent и endgrent. Вызов getgrent возвращает значения в следующем формате: ($name, $passwd, $gid, $raembers) Эти четыре значения примерно соответствуют четырем полям файла /etc/group, поэтому за подробной информацией обращайтесь к описаниям, приведенным на man-страницах, относящихся к формату этого файла. Соответствующие функции произвольного доступа - getgrgid (по идентификатору группы) и getgrnam (по имени группы). Если у вас узел с большой NIS-картой, то по соображениям производительности такой способ предобработки файла паролей лучше не использовать 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 [ 66 ] 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |