Основы Linux, часть 3
Прежде, чем вы начнете
Об этом руководстве
Добро пожаловать в "Администрирование промежуточного уровня", третье из четырех руководств, предназначенных для подготовки к экзамену LPI-101 версии 2 (Linux Professional Institute). Это руководство идеально для тех, кто хочет улучшить свои знания основ искусства администрирования Linux. Мы рассмотрим множество тем, включая систему интернет-документации, модель прав доступа Linux, управление учетными записями пользователей и настройку среды регистрации.
Если вы новичок в Linux, мы рекомендуем вам начать с части 1 и части 2. Для кого-то большая часть материала будет новым, но более опытные пользователи Linux могут найти в этом руководстве хороший способ отшлифовки своего искусства администрирования системы Linux.
К концу этой серии руководств (всего их восемь, охватывающих материалы экзаменов LPI-101 и 102), вы получите знания, необходимые, чтобы стать системным администратором Linux и, если вы захотите, подготовиться к получению сертификата LPIC первого уровня от Linux Professional Institute.
Системная и сетевая документация
Типы документации по системе Linux
По существу есть три источника документации системы Linux: страницы руководств man, страницы info и связанная с приложением документация в /usr/share/doc. В этом разделе, прежде чем смотреть"за горизонтами", мы изучим каждый из этих источников.
Страницы руководств man
Страницы руководств, или "man страцицы", -- классическая форма справочной документации UNIX и Linux. В идеале вы можете искать страницы man для любой команды, конфигурационного файлы или библиотечной функции. На практике Linux это бесплатное программное обеспечение, и некоторые страницы еще не написаны или довольно стары. Тем не менее, страницы man -- первое место, куда нужно смотреть, если вам нужна помощь.
Чтобы получить доступ к странице man, просто наберите 'man' , за которой следует предмет вашего запроса. Будет запущена программа постраничного просмотра, и когда вы все прочтете, нужно нажать 'q'. Например, чтобы посмотреть информацию о команде 'ls', вы могли бы набрать:
$ man ls
Знание плана страницы man может помочь быстро перейти к нужной вам информации. В общем, вы найдете на странице man следующие разделы: 'man':
NAME | Имя и однострочное описание команды |
SYNOPSIS | Как использовать команду |
DESCRIPTION | Глубокое обсуждение функциональности команды |
EXAMPLES | Советы, как использовать команду |
SEE ALSO | Связанные темы (обычно страницы man) |
Разделы страниц man
Файлы, которые содержат страницы руководств хранятся в /usr/share/man (или в /usr/man на некоторых старых системах). В этой директории вы найдете, что страницы man организованы в следующие разделы:
man1 | Пользовательские программы |
man2 | Системные вызовы |
man3 | Библиотечные функции |
man4 | Специальные файлы |
man5 | Форматы файлов |
man6 | Игры |
man7 | Разное |
Составные страницы man
Некоторые темы существуют в более, чем одном разделе. Чтобы продемонстрировать это, давайте используем команду 'whatis' , которая покажет все доступные страницы man по теме:
$ whatis printf printf (1) - форматирование и вывод данных printf (3) - преобразование форматного вывода
В этом случае 'man printf' по умолчанию выведет страницу из раздела 1 ("Пользовательские программы"). Если бы мы писали программу на C, более интересной для нас была бы страница из раздела 3 ("Библиотечные функции"). Вы можете вызвать страницу man, из определенного раздела, указав его в командной строке, так, чтобы запросить printf(3), мы могли бы набрать:
$ man 3 printf
Поиск нужной страницы man
Иногда трудно найти нужную страницу man для заданной темы. В этом случае вы можете попытаться использовать 'man -k', чтобы найти раздел NAME в страницах man. Предупреждаем, что это поиск подстроки, поэтому запуск чего-то похожего на 'man -k ls' даст вам массу вывода! Вот пример использования более конкретного запроса:
$ man -k whatis apropos (1) - поиск строки в базе данных whatis makewhatis (8) - Создание базы данных whatis whatis (1) - поиск полных слов в базе данных whatis
Все об apropos
Предыдущий пример дает нам еще несколько моментов. Во-первых, команда 'apropos' абсолютно эквивалентна 'man -k' . (На самом деле, открою вам маленький секрет. Когда вы запускаете 'man -k' , в действительности за кулисами запускается 'apropos'.) Второй момент это команда 'makewhatis' , которая сканирует страницы man в вашей системе Linux и строит базу данных для 'whatis' и 'apropos' . Обычно она запускается периодически, чтобы обновлять базу данных:
# makewhatis
Для получения более подробной информации по "man" со товарищи вы можете начать с ее страницы man:
$ man man
MANPATH
По умолчанию программа 'man' будет искать страницы в /usr/share/man, /usr/local/man, /usr/X11R6/man и, возможно в /opt/man. Иногда вы можете обнаружить, что в этот путь поиска вам нужно добавить дополнительный объект. В этом случае отредактируйте в текстовом редакторе /etc/man.conf и добавьте строку, которая выглядит так:
MANPATH /opt/man
Начиная с этого момента, будет находиться любая страница man в директории /opt/man/man*. Помните, что вам нужно перезапустить 'makewhatis', чтобы добавить эти новые страницы man в базу данных whatis.
GNU info
Один недостаток страниц man заключается в том, что они не поддерживают гипертекст, поэтому вы не можете просто и легко перейти от одной страницы к другой. Народ из GNU осознал этот недостаток и изобрел другой формат документации: страницы "info". Множество программ GNU сопровождается пространной документацией в форме страниц info. Вы можете начать чтение страниц info командной: 'info':
$ info
Вызов 'info' таким способом приведет вас в указатель доступных в системе страниц. Вы можете перемещаться по нему с помощью стрелок, следовать по ссылкам (показанных звездочкой), используя Ввод, и выйти из программы, нажав 'q' . Клавиши базируются на Emacs, и если вы знакомы с этим редактором, вы легко сможете перемещаться по страницам. Для знакомства с редактором Emacs смотри руководство developerWorks Жизнь в Emacs.
Вы также может указать страницу info в командной строке:
$ info diff
Для получения более подробной информации об использовании программы чтения 'info', попытайтесь прочесть ее страницу info. Вы можете перемещаться по странице с помощью тех примитивных клавиш, которые я уже упоминал:
$ info info
/usr/share/doc
Есть окончательный источник помощи в вашей системе Linux. Много программ комплектуются дополнительной документацией в других форматах: текстовом, PDF, PostScript, HTML, мы привели лишь несколько. Взгляните в usr/share/doc (или на старых системах /usr/doc). Вы обнаружите длинный список директорий, каждая из которых поставляется с некоторым приложением в вашей системе. Поиск в это документации часто может открыть некоторые жемчужины, которые недоступны в страницах man или info, такие как руководства или дополнительная техническая документация. Быстрая проверка показывает, что доступно множество материалов для чтения:
$ cd /usr/share/doc $ find . -type f | wc -l 7582
Вот так! Ваше домашнее задание на сегодняшний вечер прочитать только половину (3791) этих документов. Завтра ожидается проверка. ;-)
Проект документации Linux (LDP)
В дополнение к системной документации есть ряд замечательных ресурсов Linux в Интернете. Проект документации Linux это группа добровольцев, которые работают, собирая вместе полное множество свободной документации Linux. Цель этого проекта собрать разнообразные куски документации Linux в место, которое легко найти и использовать.
Обзор LDP
LDP состоит из следующих областей:
- Guides - большие, глубокие книги, такие как Руководство программиста Linux
- HOWTOs - конкретная помощь по темам, такие как DSL HOWTO
- FAQs - Часто Задаваемые Вопросы с ответами, такие как Brief Linux FAQ
- Страницы man - помощь по индивидуальным командам (это те же страницы man, которые вы получаете в вашей системе Linux, когда вы используете команду 'man').
Если вы не уверены, какие документы читать, вы можете воспользоваться поиском, который позволяет вам искать документацию по темам.
Дополнительно LDP предоставляет списки ссылок и ресурсов, такие как Linux Gazette (см. ссылки в Resources) и Linux Weekly News, а также ссылки на списки рассылок и архивы новостей.
Списки рассылок
Списки рассылок вероятно обеспечивают самый важный момент в сотрудничестве разработчиков Linux. Часто проекты ведутся участниками, которые живут далеко друг от друга, возможно на противоположных сторонах Земли. Списки рассылок обеспечивают метод для того, чтобы каждый разработчик контактировал с другими, и поддерживал групповое обсуждение по e-mail. Один из самых знаменитых списков рассылки разработчиков -- Linux Kernel Mailing List.
Еще о списках рассылки
Кроме разработки, списки рассылок дают метод посылки вопросов и получения ответов от осведомленных разработчиков, или даже от других пользователей. Например, отдельные дистрибьютеры часто предоставляют списки рассылки для новичков. Вы может проверить Web-сайт вашего дистрибутива, чтобы узнать, какие списки рассылок он поддерживает.
Если вы потратите время на чтение LKML FAQ по предыдущей ссылке, в можете заметить, что подписчики списка рассылки часто не очень-то доброжелательно отвечают на повторяющиеся вопросы. Всегда благоразумнее, прежде чем задавать ваш вопрос посмотреть архивы данного списка рассылки. Есть вероятность, что вы сэкономите и свое время тоже!
Группы новостей
Группы новостей похожи на списки рассылок, но основаны на протоколе, который называется NNTP ("Network News Transfer Protocol"), а не на e-mail. Чтобы стать участником такой группы, вы должны использовать клиент NNTP, например, 'slrn' или 'pan' . Основное преимущество в том, что вы принимаете участие в дискуссии тогда, когда вы хотите, вместо того, чтобы непрерывно быть в вашем inbox. :-)
Самые интересные группы новостей начинаются с comp.os.linux. Вы можете посмотреть список на сайте LDP.
Web сайты поставщиков и третьих сторон
Web сайты различных дистрибутивов Linux часто предоставляют обновленную документацию, инструкции по установке, списки совместимости/несовместимости оборудования и другую поддержку, такую как средство поиска по базе знаний. Например:
Поставщики оборудования и программного обеспечения
Многие поставщики оборудования и программного обеспечения в последние годы добавляют в свои продукты поддержку Linux, средства разработки программ, исходники, драйверы Linux для специального оборудования и другие специальные проекты Linux. Например:
Модель прав доступа Linux (The Linux permissions model)
Один пользователь, одна группа
В этом разделе мы познакомимся с моделью прав доступа и собственности. Мы уже видели, что каждым файлом владеет один пользователь и одна группа. Это самая суть модели прав доступа в Linux. Мы можете посмотреть пользователя и группу файла в листинге команды 'ls -l' :
$ ls -l /bin/bash -rwxr-xr-x 1 root wheel 430540 Dec 23 18:27 /bin/bash
В этом конкретном примере исполнимый файл /bin/bash является собственностью пользователя root и принадлежит группе wheel. Модель прав доступа Linux действует, давая возможность установить три независимых уровня доступа для каждого объекта файловой системы: доступ для собственника файла, для группы файла и всех остальных пользователей.
Разберемся с "ls -l"
Давайте взглянем на наш вывод 'ls -l' и посмотрим на первую колонку листинга the listing:
$ ls -l /bin/bash -rwxr-xr-x 1 root wheel 430540 Dec 23 18:27 /bin/bash
Первое поле -rwxr-xr- содержит символьное представление прав доступа этого конкретного файла. Первый символ (-) в этом поле показывает тип этого файла, в этом случае это регулярный файл. Другие возможности для первого символа:
'd' директория 'l' символьная ссылка 'c' символьное устройство 'b' блоковое устройство 'p' fifo 's' сокет
Три триплета
$ ls -l /bin/bash -rwxr-xr-x 1 root wheel 430540 Dec 23 18:27 /bin/bash
Оставшаяся часть поля состоит из трехсимвольных триплетов. Первый триплет представляет права доступа для собственника файла, второй -- права доступа для группы файла, а третий -- права доступа для всех остальных пользователей:
"rwx" "r-x" "r-x"
Здесь r означает, что разрешается чтение (просмотр данных файла), w означает, что разрешается запись (модификация файла, а также удаление), а x означает, что разрешается "выполнение" (запуск программы). Сводя всю эту информацию вместе, мы можем выяснить, что каждый может прочитать содержимое и выполнить этот файл, но только собственнику (root) позволено модифицировать этот файл во всех отношениях. Следовательно, в то время как обычные пользователи могут копировать этот файл, только пользователю root разрешено обновлять или удалять его.
Кто я (Who am I)?
Прежде чем узнать, как изменить владельца или группу файла, давайте посмотрим сначала, как узнать ваш текущий идентификатор (id) пользователя и групповую принадлежность. Пока вы не использовали команду 'su' , ваш текущий идентификатор пользователя (id) это тот, который вы использовали, чтобы зарегистрироваться в системе. Однако, если вы часто используете 'su' , вы можете не помнить ваш текущий эффективный идентификатор пользователя id. Чтобы увидеть его, наберите 'whoami' :
# whoami root # su drobbins $ whoami drobbins
В какой я группе?
Чтобы посмотреть группы, к которым в принадлежите, используйте команду 'groups' :
$ groups drobbins wheel audio
В этом примере я член групп drobbins, wheel и audio. Если вы хотите посмотреть в каких группах состоит другой пользователь(и), укажите их имена как аргументы:
$ groups root daemon root : root bin daemon sys adm disk wheel floppy dialout tape video daemon : daemon bin adm
Изменение собственника и группы
Чтобы изменить собственника или группу файла или другого объекта файловой системы, используйте 'chown' или 'chgrp' соответственно. Каждая из этих команд получает имя, за которым следует одно или более имен файлов.
# chown root /etc/passwd # chgrp wheel /etc/passwd
Вы можете одновременно установить собственника и группу с помощью альтернативной формы команды 'chown' :
# chown root:wheel /etc/passwd
Вы не можете использовать 'chown' , если вы не суперпользователь, но 'chgrp' может использоваться всеми для изменения групповой принадлежности файла на группу, к которой принадлежит запускающий эту команду.
Рекурсивное изменение собственника
И 'chown' , и 'chgrp' имеют опцию -R, которую можно использовать, чтобы указать им, что нужно изменить собственника и группу рекурсивно во всем дереве директорий. Например:
# chown -R drobbins /home/drobbins
Введение в chmod
'chown' и 'chgrp' можно использовать, чтобы изменить собственника и группу объекта файловой системы, но другая программа, которая называется 'chmod' используется для изменения rwx прав доступа, которые мы видим в листинге 'ls -l' . 'chmod' использует два или более аргумента: "режим" ("mode"), описывающий, какие нужно изменить права доступа, за которым следует файл или список файлов, на которые должны воздействовать эта команда:
$ chmod +x scriptfile.sh
В этом примере, наж "режим" это =+x. Как вы можете догадаться, режим +x говорит команде 'chmod' , что нужно сделать это конкретный файл исполнимым и для пользователя, и для группы, и для всех остальных.
Если бы мы хотели удалить все разрешения на исполнение файла, мы сделали бы следующее:
$ chmod -x scriptfile.sh
Детализация пользователь/группа/остальные
До сих пор наши примеры 'chmod' воздействавали на права во всех трех триплетах: пользователь, группа и все остальные. Часто бывает удобно модифицировать только один или два триплета по отдельности. Чтобы сделать это, просто укажите перед знаком + или - символ для конкретного триплета, который вы хотите модифицировать. Используйте u для триплета "user", g для триплета "group" и o для триплета "остальные/все":
$ chmod go-w scriptfile.sh
Мы просто удаляем разрешение на запись для группы и всех остальных пользователей, но оставляем нетронутыми права "собственника".
Переустановка прав доступа
Вдобавок к переключению бит доступа включено/выключено, мы можем и переустановить их все вместе. С помощью оператора =, мы можем сказать 'chmod' , что мы хотим установить указанные права и никакие другие:
$ chmod =rx scriptfile.sh
Здесь мы просто установили биты "чтения" и "исполнения" и выключили все биты "записи". Если вы хотите просто переустановить конкретный триплет, вы можете указать для триплета перед = символическое имя, например:
$ chmod u=rx scriptfile.sh
Числовые режимы
До сих пор мы использовали для указания изменений прав доступа то, что называется символьным режимом команды 'chmod' . Однако есть другой общий способ указания прав доступа: с помощью четырехзначного восьмеричного числа. В этом синтаксисе, он называется числовым синтаксисом определения прав доступа, каждая цифра представляет триплет прав доступа. Например, в 1777 777 устанавливает обсуждаем в этом разделе флаги "собственника", "группы" и "остальных". 1 используется для установки специального бита, который мы рассмотрим позже (смотри "Уклончивая первая цифра" в конце этого раздела). Эта таблица показывает, как интерпретируются со второй по четвертую цифры (777):
Режим | Цифра |
rwx | 7 |
rw- | 6 |
r-x | 5 |
r-- | 4 |
-wx | 3 |
-w- | 2 |
--x | 1 |
--- | 0 |
Числовой синтаксис прав доступа
Числовой синтаксис прав доступа особенно полезен, если вам нужно указать все права доступа к файлу, как в следующем примере:
$ chmod 0755 scriptfile.sh $ ls -l scriptfile.sh -rwxr-xr-x 1 drobbins drobbins 0 Jan 9 17:44 scriptfile.sh
В этом пример мы использовали режим 0755, что раскрывается в полную установку прав доступа -rwxr-xr-x.
umask
Когда процесс создает новый файл, он указывает, какие права доступа он хотел бы для этого файла. Часто требуемый режим -- 0666 (читаемый и записываемый для всех), что либеральнее, чем нам хотелось бы. К счастью, при создании нового файла Linux обращается к значению так называемого "umask". Система использует значение umask, чтобы ограничить первоначально указанные права доступа до более разумного и безопасного уровня. Вы можете увидеть ваш текущий umask, набрав его в командной строке:
$ umask 0022
В системах Linux обычно умалчиваемое значение umask устанавливается в 0022, что позволяет остальным читать ваши новые файлы (если они могут добраться до них), но не модифицировать их.
Чтобы сделать новые файлы по умолчанию более безопасными, вы можете изменить значение umask:
$ umask 0077
Это значение umask гарантирует, что группа и остальные не будет иметь абсолютно никаких прав на вновь создаваемые файлы. Итак, как же работает umask? В отличие от "обычных" прав доступа к файлу, umask указывает, какие права должны быть исключены. Давайте посмотрим в нашу таблицу режим-цифра, чтобы разобраться, что означает значение umask 0777:
Режим | Цифра |
rwx | 7 |
rw- | 6 |
r-x | 5 |
r-- | 4 |
-wx | 3 |
-w- | 2 |
--x | 1 |
--- | 0 |
С помощью нашей таблицы три последние цифры 0777 раскрываются в ---rwxrwx. Теперь вспомним, что 'umask' говорит системе, какие права исключить. Складывая два и два, мы видим что все права доступа для "группы" и "остальных" будут исключены, тогда как права "пользователя" останутся нетронутыми.
Введение в suid и sgid
Когда вы регистрируетесь, запускается новый процесс оболочки. Вы это уже знаете, но вы можете не знать, что этот новый процесс оболочки (обычно bash) выполняется с вашим идентификатором пользователя. Как таковая, программа bash может получить доступ ко всем файлам и директориям, которыми вы владеете. В действительности мы, как пользователи, всецело зависим от других программ, которые выполняют работу от нашего имени. Поскольку программы, которые вы запускаете, наследуют ваш идентификатор пользователя, они не могут получить доступ к объектам файловой системы, доступ к которым вам не разрешен.
Например, файл passwd обычные пользователи непосредственно изменить не могут, поскольку флаг "записи" выключен для всех пользователей, за исключением пользователя root:
$ ls -l /etc/passwd -rw-r--r-- 1 root wheel 1355 Nov 1 21:16 /etc/passwd
Однако обычным пользователям необходимо изменять /etc/passwd (по крайней мере, не напрямую), когда им нужно изменить свой пароль. Но, если пользователь не может модифицировать этот файл, как же это работает?
suid
Благодаря тому, что модель прав доступа Linux имеет два специальных бита, которые называются 'suid' и 'sgid' . Если исполняемая программа имеет установленный бит 'suid' , она будет запущена от имени собственника этой исполняемое программы, а не от имени субъекта, запустившего программу.
Теперь вернемся к проблеме /etc/passwd. Если мы посмотрим на исполняемую программу 'passwd' , мы можем увидеть, что ее собственник -- root:
$ ls -l /usr/bin/passwd -rwsr-xr-x 1 root wheel 17588 Sep 24 00:53 /usr/bin/passwd
Вы также заметите, что вместо x в триплете прав пользователя стоит s. Это указывает, что для этой конкретной программы установлены бит 'suid' и бит исполнения. По этой причине, когда запускается 'passwd' , он будет выполняться от имени пользователя root (с полными правами доступа суперпользователя), а не от имени запустившего его пользователя. И поскольку 'passwd' выполняется с правами root, он без проблем может модифицировать файл /etc/passwd.
Ловушки suid/sgid
Мы видели как работает 'suid' , и 'sgid' работает аналогичным образом. Он позволяет программам наследовать права группы, а не права текущего пользователя.
Важно!
Вот несколько вспомогательной, но важной информации о 'suid' и 'sgid' . Во-первых, биты 'suid' и 'sgid' занимают в листинге ls -l ту же позицию, что и бит x. Если бит x тоже установлен, соответственных бит будет показан как s (строчная). Однако, если бит x не установлен, он будет показан как S (прописная).Важно!
Другое важное замечание: suid и sgid удобны во многих случаях, но неподходящее использование этих бит может привести к бреши в безопасности системы. Лучше всего иметь как можно меньше программ с битом suid. Команда passwd -- одна из немногих, которая должна быть с битом suid.Изменение suid и sgid
Установка и удаление бит 'suid' и 'sgid' довольно просты. Здесь мы устанавливаем бит suid:
# chmod u+s /usr/bin/myapp
А здесь мы удаляем бит 'sgid' из директории. Ниже мы посмотрим, как работает бит 'sgid' с директриями:
# chmod g-s /home/drobbins
Права доступа и директории
До сих пор мы смотрели на права доступа с точки зрения регулярных фалов. Когда мы переходим к директориям, все немного меняется. Директории используют те же флаги доступа, но интерпретируются они чуть-чуть по-другому.
Для директории, если установлен флаг "чтения", то вы можете получить список содержимого директории; "запись" означает, что вы можете создавать файл в директории; а "выполнение" означает, что вы можете войти в директорию и получить доступ к любой поддиректории в ней. Без флага "выполнения" объекты файловой системы внутри директории не доступны. Без флага "чтения" объекты файловой системы внутри директории не видимы, но объекты в директории могут еще быть доступными, пока кто-нибудь знает полный путь к объекту.
Директории и sgid
И если у директории установлен флаг "sgid", любой объект файловой системы, созданный внутри нее, наследует группу директории. Это особое свойство оказывается удобным, если вам нужно создать дерево директорий, которое используется группой людей, принадлежащих одной и той же группе. Просто сделайте так:
# mkdir /home/groupspace # chgrp mygroup /home/groupspace # chmod g+s /home/groupspace
Теперь любой пользователь в группе mygroup может создавать файлы или директории в /home/groupspace, и им автоматически будет назначена также группа mygroup. В зависимости от установки umask пользователя, новые объекты файловой системы могут быть или не быть читаемыми, записываемыми или исполняемыми другими членами группы mygroup.
Директории и удаление
По умолчанию директории Linux ведут себя в каком-то смысле не идеально, по крайней мере, в некоторых ситуациях. Обычно каждый может переименовать или удалить файл внутри директории, пока он имеет права записи в эту директорию. Для директорий, которые используются конкретными пользователями, как раз такое поведение, как правило, хорошо.
Однако для директорий, которые используются многими пользователями, особенно /tmp и /var/tmp, такое поведение может оказаться весьма плохим. Так как каждый может писать в эти директории, но каждый может удалять или переименовывать чьи-то еще файлы, даже если он не является собственником! Очевидно, трудно использовать /tmp для чего-нибудь полезного, если кто-то другой в любой момент может набрать 'rm -rf /tmp/*' и уничтожить файлы, принадлежащие всем.
К счастью, Linux имеет так называемый стики (sticky) бит. Если /tmp имеет установленный стики бит (с помощью 'chmod +t' ), единственные, кто может удалить или переименовать файлы в /tmp, это собственник директории (обычно root), собственник файла, или root. Фактически все дистрибутивы Linux по умолчанию устанавливают стики бит для /tmp, но вы можете обнаружить, что стики бит удобен и в других ситуациях.
Уклончивая первая цифра
И в заключение этого раздела мы наконец взглянем на уклончивую первую цифру числового режима. Как вы можете видеть, эта первая цифра используется для установки стики, 'suid' , и 'sgid' битов:
suid | sgid | sticky | mode digit |
on | on | on | 7 |
on | on | off | 6 |
on | off | on | 5 |
on | off | off | 4 |
off | on | on | 3 |
off | on | off | 2 |
off | off | on | 1 |
off | off | off | 0 |
Вот пример использования четырехзначного числового режима для установки прав доступа для директории, которая будет использоваться для групповой работы:
# chmod 1775 /home/groupfiles
В качестве домашней работы, выясните смысл установки числового доступа 1755. :)
Управление учетными записями пользователей в Linux
Введение в /etc/passwd
В этом разделе мы посмотрим механизм управления учетными записями пользователя в Linux, начав с файла /etc/passwd, который определяет всех пользователей, которые существуют в системе Linux. Вы можете посмотреть свой собственный файл /etc/passwd, набрав less /etc/passwd.
Каждая строка в /etc/passwd определяет учетную запись пользователя. Вот пример строки из моего файла /etc/passwd:
drobbins:x:1000:1000:Daniel Robbins:/home/drobbins:/bin/bash
Как вы можете видеть, в этой строке совсем немного информации. Фактически каждая строка /etc/passwd состоит из некскольких полей, разделенных :.
Первое поле определяет имя пользователя (drobbins), а второе содержит x. В древних системах Linux эта поле содержало зашифрованный пароль, который использовался для аутентификации, но фактически все системы Linux теперь хранят информацию о паролях в другом файле.
Третье поле (1000) определяет численное значение идентификатора пользователя, связанное с этим конкретным пользователем, а четвертое поле (1000) связывает этого пользователя с конкретной группой; чуть ниже мы увидим, где определяется группа 1000.
Пятое поле содержит текстовое описание этой учетной записи, в нашем случае имя пользователя. Шестое поле определяет домашнюю директорию пользователя, а седьмое указывает умалчиваемую оболочку пользователя, оболочку, которая будет запускаться автоматически при регистрации пользователя.
/etc/passwd, советы и трюки
Вероятно вы заметили, что в /etc/passwd много больше учетных записей, чем зарегистированных в вашей системе. Причина этого в том, что многие компоненты Linux используют учетные записи пользователей для усиления безопасности. Обычно эти системные учетные записи имеют идентификаторы пользователя ("uid"), меньшие 100, и многие из них имеют умалчиваемую оболочку, похожую на /bin/false. Так как программа /bin/false не делает ничего, а только завершается с кодом ошибки, это эффективно препятсвует использованию этих учетных записей, как учетных записей для регистрации, они предназначены только для внутреннего использования.
/etc/shadow
Итак, сами учетные записи пользователя определены в /etc/passwd. Системы Linux содержат парный к /etc/passwd файл, который называется /etc/shadow. Этот файл, в отличие от /etc/passwd, читаемый только для root и содержит зашифрованную информацию о паролях. Давайте взглянем на образец строки из /etc/shadow:
drobbins:$1$1234567890123456789012345678901:11664:0:-1:-1:-1:-1:0
Каждая строка определяет информацию о пароле для конкретной учетной записи, и снова, каждая область разделена:. Первое поле определяет конкретную учетную запись пользователя, с которой связана эта теневая запись. Второе поле содержит зашифрованный пароль. Оставшиеся поля описаны в следующей таблице:
поле 3 | число дней с 1/1/1970, когда пароль был изменен |
поле 4 | число дней до того, как будет разрешено изменить пароль (0 для "изменять в любое время") |
поле 5 | число дней до того, как система заставит пользователя определить новый пароль (-1 для "никогда") |
поле 6 | число дней до истечения срока, когда будет предупреждаться об этом (-1 for "без предупреждений") |
поле 7 | число дней после истечения срока пароля, когда учетная запись автоматически сделается непригодной (-1 для "никогда не лишать права") |
поле 8 | число дней, когда эта учетная запись непригодна (-1 for "эта запись годится") |
поле 9 | Зарезервирована для будущего |
/etc/group
Далее мы посмотрим на файл /etc/group, где определяются все группы в системе Linux/ Вот пример строки:
drobbins:x:1000:
Формат файла /etc/group следующий. Первое поле определяет имя группы; второе поле -- исчезающее поле, которое теперь просто содержит x, и третье поле определяет числовой идентификатор группы для этой конкретной группы. Четвертое поле (в нашем пример пустое) определяет всех пользователей, принадлежащих этой группе.
Вспомните, наш образец из /etc/passwd ссылался на идентификатор группы 1000. В результате этого пользователь drobbins попадает в группу drobbins, хотя имени пользователя dorbbins нет в четвертом поле /etc/group.
Замечания о group
Замечание о связывании пользователей с группами: в некоторых системах вы обнаружите, что каждая новая учетная запись связана с группой с идентичным именем (и обычно с идентичным номером). В других системах все учетные записи регистрации принадлежат к одной группе users. Подход, который в используете в системе(ах), которые вы администрируете, это ваш выбор. Создание своих групп для каждого пользователя имеет преимущество, позволяя пользователям легко контролировать доступ к своим собственным файлам, помещая доверенных друзей в свою персональную группу.
Добавление пользователя и группы вручную
Теперь я покажу вам, как создать вашу собственную учетную запись пользователя и группы. Лучший способ изучить, как это сделать, добавить нового пользователя в систему вручную. Для начала убедимся что ваша переменная среды EDITOR установлена в ваш любимый редактор:
# echo $EDITOR vim
Если нет, вы можете установить EDITOR, набрав что-то вроде:
# export EDITOR=/usr/bin/emacs # vipw
Теперь вы должны оказаться в вашем любимом текстовом редакторе с загруженным файлом /etc/passwd. Модифицируя системные файлы passwd и group, очень фажно использовать команды 'vipw' и 'vigr' . Они предпринимают дополнительные предосторожности, чтобы убедиться, что ваши критические файлы passwd и group надлежащим образом заперты, так что они не исказятся.
Редактироание /etc/passwd
Теперь, когда ваш файл /etc/passwd в редакторе, идите дальше и добавьте следующую строку
testuser:x:3000:3000:LPI tutorial test user:/home/testuser:/bin/false
Вы только что добавили пользователя "testuser" с UID 3000. Мы добавляем ешл в группу с GUD 3000, которая еще не создана. Мы могли бы при желании назначить этому пользователю GID группы users. Комментарий у этого нового пользователя: LPI tutorial test user; домашняя директория: /home/testuser и оболочка пользователя в целях безопасности: /bin/false. Если бы мы создавали не тестовую учетную запись, мы могли бы установить оболочку в /bin/bash. Хорошо, пойдем вперед, сохраним ваши изменения и выйдем из редактора.
Редактирование /etc/shadow
Теперь нам нужно добавить запись для конкретного пользователя в /etc/shadow. Чтобы сделать это, наберите 'vipw -s' . Вас поприветствует ваш любимый редактор, который теперь содержит файл /etc/shadow. Теперь вперед, скопируйте строку существующей учетной записи (одну из тех, у которой пароль длиннее, чем у стандартной системной учетной записи):
drobbins:$1$1234567890123456789012345678901:11664:0:-1:-1:-1:-1:0
Теперь измените имя пользователя в скопированной строке на имя вашего нового пользователя и убедитесь, что все поля (особенно поля со сроками пароля) установлены так, как вам нравится:
testuser:$1$1234567890123456789012345678901:11664:0:-1:-1:-1:-1:0
Теперь сохраните и выйдите из редактора.
Установка пароля
Вы вернетесь к приглашению оболочки. Теперь самое время установить для вашего нового пользователя пароль:
# passwd testuser Enter new UNIX password: (введите новый пароль для testuser) Retype new UNIX password: (введите новый пароль еще раз)
Редактирование /etc/group
Теперь, когда /etc/passwd и /etc/shadow обеспечены, время должным образом сконфигурировать /etc/group. Чтобы сделать это, наберите:
# vigr
Ваш файл /etc/group предстанет перед вами, готовый к редактированию. Теперь, если вы решили назначить для вашего конкретного пользователя умалчиваемую группу users, вам не нужно добавлять в /etc/groups никакой группы. Однако, если вы решили создать для этого пользователя новую группу, вперед, добавьте следующую строку:
testuser:x:3000:
Тепеь сохраните и завершите работу.
Создание домашней директории
Мы почти все сделали. Наберите следующие команды, чтобы создать домашнюю директорию пользователя testuser:
# cd /home # mkdir testuser # chown testuser.testuser testuser # chmod o-rwx testuser
Домашняя директория нашего пользователя теперь на месте и учетная запись готова к использованию. Ну, почти готова. Если бы вы хотели использовать эту учетную запись, вам было бы нужно использовать vipw для изменения умалчиваемой оболочки для testuser на /bin/bash, так чтобы пользователь мог начать сеанс работы.
Утилиты администрирования учетных записей
Теперь, когда вы знаете, как добавить новую учетную запись и группу вручную, давайте рассмотрим различные сохраняющие время утилиты администрирования учетных записей, доступных в Linux. Из-за ограниченного объема мы не будем касаться множества деталей, описывающих эти команды. Помните, что вы всегда можете получить дополнительную информацию о командах, просматривая страницы руководства man для этой команды. Если вы планируете сдавать экзамен LPIC 101, вам следует потратить некоторое время для ознакомления с каждой из этих команд.
newgrp
По умолчанию любому файлу, который создается пользователем, назначается группа, указанная в /etc/passwd. Если пользователь принадлежит другим группам, он или она может набрать newgrp thisgroup чтобы установить группу thisgroup, как текущую умалчиваемую группу, к которой принадлежит пользователь.
'chage' | Команда 'chage' используется для просмотра и изменения установок возраста пароля, которые хранятся в /etc/shadow. |
'gpasswd' | Средство администрирования общего назначения. |
'groupadd' / 'groupdel' / 'groupmod' | Используются для добавления/удаления/модификации групп в /etc/group |
'useradd' / 'userdel' / 'usermod' | Используются для добавления/удаления/модификации пользователей в /etc/passwd. Эти команды выполняют также различные удобные функции. Смотри дополнительную информацию в страницах man. |
'pwconv' / 'grpconv' | Используются для преобразования файлов passwd и group в теневые пароли "нового стиля". Фактически все системы Linux уже используют теневые пароли, так что эти команды вам никогда не потребуются. |
Настройка среды пользователя
Введение в "fortune"
Ваша оболочка имеет множество полезных опций, которые вы хотите задействовать, чтобы приспособить к вашим персональным предпочтениям. До сих пор, однако, мы не обсуждали никаких способов получать эти установки автоматически, каждый раз, когда вы начинаете сеанс работы, кроме как каждый раз набирать их снова. В этом разделе мы рассмотрим настройку вашей среды с помощью модификации ваших файлов запуска.
Сначала давайте добавим дружеское сообщения при вашей первой регистрации. Чтобы увидеть пример сообщения, запустите 'fortune' :
$ fortune No amount of careful planning will ever replace dumb luck.
.bash_profile
Теперь давайте сделаем так, чтобы 'fortune' запускался бы каждый раз, когда вы регистрируетесь в системе. Воспользуйтесь вашим любимым редактором для редактирования файла с именем .bash_profile в вашей домашней директории. Если файла не существует, создайте его. Вставьте в начало строку:
fortune
Попробуйте завершить сеанс и снова начать его. Если вы не выполняете менеджер дисплея, подобного xdm, gdm или kdm, когда вы начнете сеанс, вас должны весело поприветствовать:
mycroft.flatmonk.org login: chouser Password: Freedom from incrustations of grime is contiguous to rectitude. $
Запуск оболочки
Когда запускается bash, он проходится по файлу .bash_profile в вашей домашней директории, выполняя каждую строку, как если бы она была набрана в приглашении bash. Английское название этого процесса -- sourcing (обработка командой source).
Bash работает немного по-разному, в зависимости от того, как он запускается. Если он запускается при регистрации в системе, он работает, как это было описано выше, сначала обрабатывая строки общесистемного /etc/profile, а затем вашего персонального ~/.bash_profile.
Существует два способа потребовать, чтобы bash запускался как при регистрации в системе. Один способ используется, когда вы впервые входите в систему: bash запускается с именем процесса -bash. Вы можете увидеть это в листинге ваших процессов:
$ ps u USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND chouser 404 0.0 0.0 2508 156 tty2 S 2001 0:00 -bash
Вероятно вы увидите намного более длинный листинг, но у вас должна быть по крайней мере одна КОМАНДА с дефисом перед именем вашей оболочки, как -bash в нашем примере. Этот дефис используется оболочкой, чтобы определить, была ли запущена оболочка при входе в систему.
Разбираемся в --login
Второй способ потребовать, чтобы bash запускался как при регистрации в системе, запустить его с опцией командной строки '--login' . Иногда это используется эмуляторами терминала (такими как xterm), чтобы заставить их сессию bash работать как при регистрации.
После того как вы зарегистировались, можно запустить множество копий вашей оболочке. Если вы не запускаете их с опцией '--login' или у имени вашего процесса не дефиса, эти сессии не будут такими, как при регистрации в системе. Хотя они и дают вам приглашение, однако они называются интерактивными оболочками. Если bash запущен как интерактивный, но не регистрационный, он будет игнорировать /etc/profile и ~/.bash_profile, а вместо этого будет выполнять построчно (как командой source) ~/.bashrc.
interactive | login | profile | rc |
yes | yes | source | ignore |
yes | no | ignore | source |
no | yes | source | ignore |
no | no | ignore | ignore |
Проверка интерактивности
Иногда bash выполняет ваш ~/.bashrc, даже если он на самом деле не интерактивен, например, если используются такие команды, как rsh и scp. Это важно иметь это в виду, потому что вывод текста, как мы это делали раньше с помощью команды fortune, может действительно испортить такие неинтерактивные сессии. Хорошая мысль -- использовать переменную PS1, чтобы определить, поистине ли интерактивна текущая оболочка, перед тем как выводить текст в стартовых файлах:
if [ -n "$PS1" ]; then fortune fi
/etc/profile и /etc/skel
На вас, как на системном администраторе лежит забота о файле /etc/profile. Так как он выполняется каждым, регистрирующимся в системе, важно содержать его в рабочем порядке. В то же время это мощное средство заставить все правильно работать, как только новые пользователи зарегистрируются под своей новой учетной записью.
Однако есть некоторые установки, которые вы хотите сделать умалчиваемыми для новых пользователей, но в то же время позволить пользователям легко изменять их. Именно здесь оказывается полезной директория /etc/skel. Когда вы используете команду 'useradd' , чтобы создать учетную запись нового пользователя, эта команда копирует файлы из /etc/skel в новую домашнюю директорию пользователя. Это значит, что вы можете положить полезные файлы .bash_profile и .bashrc в /etc/skel, чтобы обеспечить новым пользователям хорошее начало.
export
Переменные в bash можно отмечены так, что они будут устанавливать такими же во всех оболочках, которые это bash вызывает; это называется отметить для экспорта. Вы можете получить список всех переменных bash, которые отмечены для экспорта в вашей сессии оболочки:
$ export declare -x EDITOR="vim" declare -x HOME="/home/chouser" declare -x MAIL="/var/spool/mail/chouser" declare -x PAGER="/usr/bin/less" declare -x PATH="/bin:/usr/bin:/usr/local/bin:/home/chouser/bin" declare -x PWD="/home/chouser" declare -x TERM="xterm" declare -x USER="chouser"
Отметка переменных для экспорта
Если переменная не отмечена для экспорта, в любой новой оболочке, которую запускает текущая оболочка, эта переменная не будет установлена. Однако вы можете отметить переменную для экспорта передав ее встроенной команде 'export' :
$ FOO=foo $ BAR=bar $ export BAR $ echo $FOO $BAR foo bar $ bash $ echo $FOO $BAR bar
В этом примере обе переменные FOO и BAR установлены, но только BAR отмечена для экспорта. Когда запускается новая оболочка, он теряет значение для FOO. Если выйти из этого нового bash, вы можете увидеть, что исходный bash все еще имеет значения и для FOO, и для BAR:
$ exit $ echo $FOO $BAR foo bar
Export и set -x
Такое поведение позволяет установить переменные в ~/.bash_profile или /etc/profile и отметить их для экспорта, и потом нет необходимости устанавливать их снова. Однако есть некоторые опции, которые не могуть экспортироваться, и, следовательно, чтобы установить их, необходимо поместить их в ваш ~/.bashrc и ваш profile. Эти опции устанавливаются с помощью встроенной команды
$ set -x
Опция '-x' заставляет bash выводить каждую команду, которую он собирается выполнять:
$ echo $FOO $ echo foo foo
Это может быть очень важным для понимания неожиданного поведения в раскрытии переменных или похожих странностей. Чтобы выключить опцию '-x' , выполните команду 'set +x' . Для получения подробностей всех опций встроенной команды set, смотри страницу руководства man.
Установка переменных с помощью "set"
Встроенную команду 'set' можно использовать и для установки переменных, но ее использование для этого необязательно. Команда bash 'set FOO=foo' означает точно то же самое, что и 'FOO=foo' . Удаление переменной выполняется с помощью встроенной команды 'unset' :
$ FOO=bar $ echo $FOO bar $ unset FOO $ echo $FOO
Unset vs. FOO=
Это не то же самое, что установка пустого значения переменной, хотя иногда трудно уловить различие. Один способ выяснить это -- использовать встроенную команду 'set' без параметров, чтобы вывести список всех текущих переменных:
$ FOO=bar $ set | grep ^FOO FOO=bar $ FOO= $ set | grep ^FOO FOO= $ unset FOO $ set | grep ^FOO
Использование 'set' без параметров аналогично использованию встроенной команды 'export' , за исключением того, что 'set' выводит список всех переменных, а не отмечает их для экспорта.
Экспортирование для изменения поведения команд
Часто поведение команд можно изменить установив переменные среды. Также как и новые сессии bash, другие команды, которые запускаются из командной строки, будет видеть переменные, только отмеченные для экспорта. Например команда 'man' проверяет переменную PAGER, чтобы узнать, какая программ используется для перемещения по странице.
$ PAGER=less $ export PAGER $ man man
С PAGER, установленной в 'less' , вы увидите одну страницу в каждый момент, и нажимая пробел перейдете к следующей странице. Если вы измените PAGER на 'cat' , текст будет выведен сразу, без остановки.
$ PAGER=cat $ man man
Использование "env"
К сожалению, если вы забыли установить PAGER в 'less' , 'man' (также как и некоторые другие команды) будет продолжать выводить все свои тексты без остановки. Если вы хотите установить PAGER в 'cat' только для одного выполнения команды, вы можете использовать команду 'env' :
$ PAGER=less $ env PAGER=cat man man $ echo $PAGER less
На этот раз PAGER был экспортирован команде 'man' со значением 'cat' , но сама переменная PAGER в сессии bash осталась неизменной.
Резюме и ресурсы
Резюме
Поздравления по поводу окончания части три этой серии руководств! К этому моменту вы должны знать, как определить, где находится информация в системной документации и Интернете, и вы должны хорошо усвоить модель прав доступа Linux, управление учетными записями пользователей и настройку переменных входа в систему.
Ресурсы
Обязательно проверьте различные ресурсы документации Linux, рассмотренные в этом руководстве, особенно Linux Documentation Project. Вы найдете эту коллекцию руководств, HOWTO, FAQ и страниц man бесценной. А также обязательно проверьте Linux Weekly News.
Руководство системных администраторов Linux (доступно в разделе "Guides" на www.tldp.org) -- хорошее дополнение к этой серии руководств -- прочитайте его! Вы можете также найти полезным Unix and Internet Fundamentals HOWTO Эрика С.Раймонда.
В серии статей Bash в примерах, Даниэл Роббинс показывает вам, как использовать конструкции программирования bash для написания своих собственных скриптов. Эта серия (особенно части 1 и 2) -- хорошая подготовка к экзамену LPIC первого уровня и подкрепляет концепции, рассмотренные в разделе "Настройка среды пользователя":
- Bash в примерах, часть 1: Основы программирования в оболочке bash
- Bash в примерах, часть 2: Еще об основах программирования в оболочке Bash
- Bash в примерах, часть 3: Исследование системы ebuild.
Если вы не знакомы с редактором vi, посмотрите Введение в vi -- руководство по методу шпаргалок. Это руководство даст вам легкое и быстрое введение в этот мощный текстовый редактор. Посмотрите этот обязательный для чтения материал, если вы не знаете, как использовать 'vi'.
Для введения в редактор Emacs смотрите руководство developerWorks Жизнь в Emacs.
Даниэл Роббинс

This is not really me
Дэниэл Роббинс -- основатель сообщества Gentoo и создатель операционной системы Gentoo Linux. Дэниэл живет в Нью-Мексико со своей женой Мэри и двумя энергичными дочками и является основателем и ведущим Funtoo. Дэниэл написал много технических статей для IBM developerWorks, Журнала разработчиков серверов Intel и пользователей C/C++/ (Intel Developer Services and C/C++ Users Journal).
Об авторе
Chris Houser
Chris Houser has been a UNIX proponent since 1994 when he joined the administration team for the computer science network at Taylor University in Indiana, where he earned his Bachelor's degree in Computer Science and Mathematics. Since then, he has worked on software in a variety of fields including web applications, video editing, UNIX device drivers, and defense, and is currently employed at Sentry Data Systems. He has also contributed to various free software projects such as Gentoo Linux and Clojure. He has most recently co-authored "The Joy of Clojure," available at http://joyofclojure.com.
Aron Griffis
Aron Griffis lives in the Boston area, where he's spent the past decade working for Hewlett-Packard on projects such as Tru64 UNIX network drivers, Linux security certification, Xen and KVM virtualization, and most recently HP's ePrint platform. When he's not actively hacking, Aron mulls over programming problems while riding his bicycle, juggling clubs, or cheering for the Red Sox.