LPI 101 (Часть третья)

Материал из База знаний Linux.ру

Перейти к: навигация, поиск

Содержание

Перед тем как начать

О данном руководстве

Добро пожаловать в "Непосредственное администрирование" третье из четырёх руководств, разработанное для подготовки вас к экзамену Linux Professional Institute 101 (второе издание). Данное руководство (третья его часть) прекрасно подходит тем, кто хочет улучшить основные навыки системного администрирования в Linux. Мы рассмотрим здесь различные темы, касающиеся системной и сетевой документации, модели разрешений в Linux, управление учётными записями пользователей и более тонкой настройке пользовательского окружения.

Если вы совсем не разбираетесь в Linux, то рекомендуем вам для начала ознакомиться с первой и второй частью данного руководства. Для большинства людей этот материал будет новым, но даже тем, кто уже является достаточно опытным пользователем Linux он может пригодиться для того, чтобы освежить свои знания в области администрирования системы.

По окончанию изучения этой серии материалов (всего их восемь, охватывающих экзамены LPI 101 и 102) у вас появятся знания позволяющие вам стать системным администратором Linux, и быть готовым к сдаче экзамена для получения сертификата LPIC 1-го уровня в Linux Professional Institute, если вы того пожелаете.

Системная и сетевая документация

Виды документации в системе

Имеется три основных вида документации в Linux-системе: справочные страницы, информационные страницы и идущая в поставке с приложением документация, которая располагается в /usr/share/doc. В данном разделе мы подробно рассмотрим все три вида источника информации.

Справочные страницы

Справочные страницы (больше известные как "manual pages" или маны) - это общепринятый вид документации в UNIX и Linux среде. В идеале, вы всегда можете посмотреть справочную страницу по любой команде, конфигурационному файлу, или базовой библиотеке. Хотя в реальности Linux это свободная система, поэтому пишут их далеко не всегда, или они являются устаревшими. Но так или иначе, справочные страницы это первое место, куда нужно обращаться за помощью.

Чтобы получить доступ к справочным страницам, достаточно ввести команду "man" по той теме, которая вам требуется, после чего откроется необходимый текст. Если вам потребуется выйти, то достаточно нажать клавишу "q". В качестве примера приведём ситуацию, когда вам требуется прочесть документацию по команде ls:

$ man ls

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

  • NAME Название и краткое описание команды
  • SYNOPSIS Как использовать команду
  • DESCRIPTION Подробное описание функционала команды
  • EXAMPLES Примеры использования команд
  • SEE ALSO Смежные темы (обычно, тоже man-страницы)

Небольшое отступление. При включённой русской локали, данная документация может быть доступна полностью на русском языке.

Структура справочных страниц

Файлы включающие в себя справочные страницы содержатся в каталоге /usr/share/man (или как в некоторых устаревших системах /usr/man). Внутри данного каталога можно обнаружить следующую структуру по которой организованы данные страницы:

  • man1 Пользовательские команды
  • man2 Системные вызовы
  • man3 Функции библиотек
  • man4 Специальные файлы
  • man5 Форматы файлов
  • man6 Игры
  • man7 Прочее

Справочные страницы со сложной структурой

Некоторые темы могут описываться в нескольких разделах. Дабы продемонстрировать вам подобное, давайте используем команду whatis, которая показывает все доступные справочные страницы по выбранной нами теме:

$ whatis printf
printf               (1)  - format and print data
printf               (3)  - formatted output conversion

В данном случае, команда man printf по умолчанию показывает раздел описывающий пользовательскую команду в разделе 1. Однако, если б мы писали программу на языке программирования Си, то нас бы явно заинтересовала стринца находящаясяв третьем разделе ("Библиотечные функции"). Вызвать необходимую страницу можно указав конкретный раздел при вводе в командной строке. Таким образом, чтобы получить информацию о printf(3), нам необходимо сделать следующее:

$ man 3 printf

Как найти правильную справочную страницу

Иногда бывает довольно проблематично сразу найти нужную документацию по выбранной теме. В этом случае можно попробовать воспользоваться командой man -k, которая смотрит заголовки справочных страниц в поле NAME. Обратите внимание, что данная команда работает с построчным поиском, так что если вы вдруг запустите что-нибудь вроде man -k ls, то у вас получится очень большой выхлоп!

Давайте поглядим пример запроса:

$ man -k whatis
apropos              (1)  - search the whatis database for strings
makewhatis           (8)  - Create the whatis database
whatis               (1)  - search the whatis database for complete wo

Узнаём всё о команде apropos

Предыдущий рассмотренный пример показал нам кое-что новое. Во-первых, это apropos. Команда, которая по действию аналогична команде man -k (Я вам по секрету, кстати, даже больше скажу. Когда вы запускаете man -k, в фоне работает именно apropos). Во-вторых, следующим результатом поиска нам была показана команда makewhatis, которая сканирует вашу систему на наличие всех man-страниц и создаёт базу данных, которую потом используют команды whatis и apropos. В обычной ситуации, её надо периодически запускать от лица суперпользователя root, чтобы поддерживать её в актуальном состоянии:

# makewhatis

Для бОльших подробностей о команде man и других полезных вещах, вам нужно ввести в консоли следующее:

$ man man

Переменная MANPATH

По умолчанию команда man ищет документацию в /usr/share/man, /usr/local/man, /usr/X11R6/man и в некоторых случаях /opt/man. В определённых случаях вам бывает необходимо добавить дополнительный путь для поиска документации. В этом случае, вам достаточно просто отредактировать файл /etc/man.conf в текстовом редакторе и добавить строку вроде такой:

MANPATH /opt/man

С этого момента будут находиться любые справочные страницы которые лежат в каталоге /opt/man/man*. И помните, что вам будет необходимо запустить makewhatis, чтобы добавить новые man-страницы в базу данных whatis.

GNU info

Одним из недостатков man-страниц является то, что они не поддерживают гиперссылки, поэтому вы не можете просто так переходить от одного раздела к другому. Ребята из проекта GNU учли этот недостаток, и посему они разработали другой формат документации - "информационные" страницы. Многие из GNU-шных программ идут с обширной документацией в виде этих информационных страниц. Для того, чтобы их прочесть, достаточно набрать команду info:

$ info

Вызов команды info запускает отображение индекса всех info-страниц в системе. Вы можете перемещаться туда-сюда используя клавиши со стрелками, ходить по ссылкам (помеченные знаком звёздочки) используя клавишу Enter и выходить по клавише q. Это основные клавиши редактора Emacs. Так что можете легко ориентароваться во всём этом, если знакомы с данным текстовым редактором. Для введения Emacs можно посмотреть сайт IBM DeveloperWorks, где есть статья-руководство "Living in Emacs". (англ.)

Можно также посмотреть конкретную info-страницу с помощью команд:

$ info diff

Для более подробной информации по использованию команды info, попробуйте прочесть информационную страницу по этой команде. Для навигации по ней достаточно использовать те клавиши, которые я уже указывал:

$ info info

Каталог /usr/share/doc

Это последнее место, где можно отыскать справку в вашей системе. Многие программы идут с дополнительной документацией в разных форматах: текстовом, pdf, PostScript, HTML и других. Взгляните в каталог /usr/share/doc (или в /usr/doc/ на старых системах). Там вы найдёте обширный список директорий, каждая из которых относится к определённой программе установленной в вашей системе. Поиск среди этой документации частенько помогает найти такое, что не удаётся откопать с помощью справочных или информационных страниц. Например, подробные руководства или дополнительную техническую информацию. Беглый осмотр показывает просто прорву материала для чтения:

$ cd /usr/share/doc
$ find . -type f | wc -l
7582

Хе-хе-хе! Даю вам в качестве домашнего задания задачу - прочитать хотя бы половину (3791) из этого материала. Начинать можете с завтрашнего дня. :-)

Проект Linux Documentation

В дополнение к документации идущей с системой, имеется определённое количество прекрасных ресурсов посвящённых ОС Linux в сети Интернет. Проект Linux Documentation - это группа добровольцев, которые вместе занимаются созданием полной и свободной документации по операционной системе Linux. Проект работает объединяя разрозненные куски документации по Linux в одном месте и организовывая простой и удобный поиск по ним.

Обзор LDP

Проект LDP состоит из нескольких разделов:

  • Учебники и руководства - подробные, длинные книги вроде "Руководства программиста под Linux" (англ.)
  • HOWTO - сборник рецептов по каким-то конкретным темам. Например, DSL HOWTO
  • FAQ - сборник ответов на самые часто задаваемые вопросы.
  • Man-страницы - справка по конкретным командам (то же самое, что можете увидеть введя команду man у себя в системе).

Если не знаете в каком разделе смотреть, то можете воспользоваться поиском, который покажет вам необходимые результаты по темам.

LDP кроме того поддерживает список ссылок и ресурсов, например, на LinuxGazette (см. ссылки в разделе "Ресурсы" в конце этой статьи) и Linux Weekly News, а также ссылки на почтовые рассылки и архивы новостей.

Почтовые рассылки

Почтовые рассылки решают, пожалуй, наиболее важную часть взаимодействия между разработчиками Linux. Очень часто проекты разрабатываются контрибуторами, которые живут в разных местах, нередко даже в разных частях земного шара. Почтовые рассылки позволяют разработчикам связываться с другими и поддерживать дискуссии используя электронную почту. Одна из самых знаменитых рассылок - Linux Kernel Mailing List aka LKML.

Подробнее о рассылках

Помимо разработки, почтовые рассылки могут являться способом для того, чтобы задавать вопросы и получать ответы на интересующие вопросы от именитых разработчиков или других пользователей. К примеру, определённые дистрибутивы всегда имеют рассылку для новичков. Мы можете посмотреть информацию во Всемирной паутине и найти нужную рассылку по вашему дистрибутиву.

Если вы потратите немного времени на чтение FAQ в уже упомянутой нами рассылке LKML, то обратите внимание, что там предупреждают новых подписчиков о том, что существуют вопросы на которые вы не сможете получить быстрый ответ. Ещё более разумным будет использование поиска по архиву рассылки, перед написанием вопроса. Это может помочь вам и сэкономит время, в том числе и ваше.

Группы новостей

Группы новостей Интернете очень похожи на почтовые рассылки, с той разницей, что они используют протокол NNTP (Network News Transfer Protocol) вместо электронной почты. Чтобы подписаться, вам необходимо использовать NNTP-клиент вроде 'slrn' или 'pan'. Основное её преимущество в том, что вы можете выбрать только нужную часть дискуссии, вместо того, чтобы забивать ваш почтовый ящик ей целиком. :)

Изучение групп новостей следует начать в первую очередь с comp.os.linux. Более полный список можно посмотреть на сайте LDP.

Сторонние сайты производителей

Веб-сайты различных дистрибутивов Linux часто имеют обновляемый набор документации, инструкций по установке, списков совместимости оборудования и других видов поддержки, вроде поиска по базе знаний. Например, можете посмотреть сайты:

Производители программного и аппаратного обеспечения

Многие производители программного и аппаратного обеспечения добавили поддержку Linux в свои продукты за последние несколько лет. На этих сайтах вы можете найти информацию о том, какое аппаратное обеспечение поддерживает Linux, программы и инструменты для разработки, исходники, скачать драйверы для операционной системы Linux для специфического оборудования и многое другое. Примеры:

Модель разрешений в Linux

Один пользователь, одна группа

В этом разделе мы рассмотрим модель разрешений и владельцев в операционной системе Linux. Мы уже знаем, что каждый файл используется определённым пользователем и группой. Это самая основа модели разрешений в 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 и изучим первую колонку в листинге:

$ ls -l /bin/bash
-rwxr-xr-x    1 root     wheel      430540 Dec 23 18:27 /bin/bash

Первое поле -rwxr-xr-x содержит символьную расшифровку разрешений обычного файла. Первый символ "-" - поле описывающее, что это самый обычный файл. В других случаях возможны варианты:

'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 имеет право его удалять и записывать в него.

Кто я?

Перед тем как мы изучим смену пользователя и группы у файла, давайте поглядим, как можно узнать ваш текущий идентификатор и группу в которую вы входите. Если вы не используете такую команду как su часто, то вы и так узнаете свой идентификатор при входе в систему. Если же вы используете su слишком часто, то в какой-то момент можете забыть из под какого же пользователя вы сидите. Чтобы узнать это, наберите команду 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 допускает два и более аргумента: "режим" описывающий какие разрешения будут изменены для одного или нескольких файлов:

$ chmod +x scriptfile.sh

В примере выше наш "режим" - +x. Как вы уже наверное догадались, режим +x сообщает команде chmod, что надо указанный файл требуется сделать исполняемым для всех. Если вы хотите убрать все разрешения на запуск, достаточно сделать следующее:

$ chmod -x scriptfile.sh

Разбиение пользователей/групп/прочих

Итак, в примерах использования команды chmod выше, мы применили разрешения для всех триплетов сразу - для пользователей, группы и всех остальных. но очень часто бывает необходимо изменить права для одного или только двух триплетов сразу. Чтобы сделать это, достаточно указать буквенное обозначение на необходимый триплет, который хотите изменить, до указания символа "+" или "-". Используйте символ "u" для указания триплета пользователя, символ "g" - для указания триплета группы и символ "o" для указания триплета "все остальные":

$ chmod go-w scriptfile.sh

Мы только что удалили разрешение на запись для группы и остальных пользователей, но оставили права владельца нетронутыми.

Сброс разрешений

В дополнение к смене бита разрешений, мы также можем их все сбросить. Используя оператор =, мы говорим команде chmod сбросить только разрешения и ничего более:

$ chmod =rx scriptfile.sh

В примере выше мы указали, что требуется установить биты "запись" и "выполнение", но сбросить при этом все биты "запись". Если вы хотите сбросить какой-то определённый триплет, то необходимо указать символьное имя для него перед символом знака "равно":

$ chmod u=rx scriptfile.sh

Цифровые режимы

До сего момента мы использовали символьные режимы для указания смены определённого разрешения с помощью chmod. Однако существует другой способ указания требуемых разрешений: используя 4-х разрядный шестнадцатеричный код. Используя синтаксис, известный как "цифровые разрешения", где каждый разряд указывает на соответствующий триплет. Например, числа 1777, 777 устанавливают флаги доступа к файлам в тот вид, который мы обсуждали в примерах выше. Цифра 1 здесь устанавливает специальный разрешающий бит, который мы будем рассматривать немного погодя (см. раздел "Незаметный первый разряд" в конце главы). Таблица ниже покажет, как надо расшифровывать последние три из четырёх разрядов:

Режим 	Разряд
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

Нормальное значение umask на системах с установленной ОС Linux равно 0022, которое позволяет читать вам свежесозданные файлы (по возможности, конечно), но не модифицировать их. Дабы сделать новые файлы более защищёнными по умолчанию, можно сменить значение umask:

$ umask 0077

Данное значение umask гарантированно обеспечит вам то, что у группы и других пользователей не будет никакой возможности доступа к новым файлам. Так как же работает umask? Работая отличным от задания "обычных" прав доступа к файлам, umask указывает какие разрешения должны быть отключены. Давайте изучим табличку где описывается соответствие режима разряду, чтобы было понять значение числа 0077:

Режим 	Разряд
rwx 	7
rw- 	6
r-x 	5
r-- 	4
-wx 	3
-w- 	2
--x 	1
--- 	0

Глядя на эту таблицу становится ясно, что 0077 обозначает ---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 существует два специальных бита которые называются sgid и suid. Когда на исполняемый файл устанавливается 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. Во-первых, sud и sgid находятя в том же месте, что и бит "x" видный в листинге команды ls -l. Если бит "х" установлен одновременно с вышеуказанными, то старший бит будет указан как s (в нижнем регистре). Если же бит выполнения не установлен, то он будет отображаться как S (в верхнем регистре).

Важно знать!

Второе важное примечание: suid и sgid может пригодится в очень многих случах, но неправильное использование указанных битов может привести к тому, что безопасность системы будет сильно снижена. Чем меньше у вас будет suidных программ, тем лучше. Хотя команда passwd одна из немногих, где выставленный бит suid жизненно необходим.


Изменение suid и sgid

Установка и удаление битов sgid и suid весьма несложные. Вот так, например, мы выставляем suid-бит:

# chmod u+s /usr/bin/myapp

А вот так мы снимаем 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 bit). Например, если установить "липкий бит" на каталог /tmp (с помощью команды chmod +t), то удалять или переименовывать файлы могут только владельцы файлов или каталога /tmp (обычно, им является root) или суперпользователь root. Как правило, во всех дистрибутивах Linux этот бит для каталога /tmp уже установлен, но вы можете найти данную возможность весьма полезной и в других ситуациях.

Незаметный первый разряд

И в завершение данного раздела мы, наконец-то, рассмтрим незаметный первый разряд цифрового режима. Как видите, он используется для "липкого" бита, а также для sgid и suid:

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

Приведу пример использования 4-х разрядного цифрового режима для выставления разрешений каталога, котрый будет использоваться рабочей группой:

# chmod 1775 /home/groupfiles

В качестве домашнего домашнего задания рекомендую выяснить, что же означает данное число в правах доступа. :)

Управление учётными записями в Linux

Введение в файл /etc/passwd

В этом разделе мы изучим механизм управления учётными записями в Linux, начиная с файла /etc/passwd, который описывает нам, какие пользователи существуют в системе. Содержимое своего файла /etc/passwd вы можете узнать введя в консоли команду less /etc/passwd.

Каждая строка в файле /etc/passwd соответствует учётной записи в системе. В качестве примера приведу свой /etc/passwd:

drobbins:x:1000:1000:Daniel Robbins:/home/drobbins:/bin/bash

Как видите, информации содержащейся в одной строке более чем достаточно. Кстати, каждая строка в файле /etc/passwd содержит несколько полей, разделённых символом двоеточия.

Первое поле описывает имя пользователя, а второе поле содержит символ "x". На старых системах с ОС Linux это поле содержало зашифрованный пароль необходимый для аутентификации, но в реальности, все современные Linux-системы держат информацию об этом пароле в другом файле.

Третье поле (1000) содержит числовой идентификатор пользователя ассоциируемый с конкретным пользователем, четвёртое поле (1000) соотносится с конктерной группой, куда входит пользователь. В следующих разделах мы рассмотрим, как задаётся группа.

Пятое поле содержит текстовое описание данной учётной записи. В нашем случае это имя пользователя. Шестое поле описывает расположение домашней директории пользователя, а седьмое - его командную оболочку по умолчанию, которая запускается сразу же после его входа в систему.

Советы и фокусы связанные с файлом /etc/passwd

Как вы наверное заметили, в файле /etc/passwd перечислено значительно больше пользователей, чем тех, кто реально использует систему. Так происходит потому, что различные компоненты Linux используют учётные записи для улучшения безопасности. Обычно, в таких случаях, учётные записи системных пользователей имеют идентификационный номер меньше ста и большинство из них имеют оболочку для входа указанную как /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 означает "не предупреждать")

поле 7 # количество дней после истечения срока действия пароля, когда учётная запись будет автоматом заблокирована (-1 - "никогда не блокировать")

поле 8 # количество дней во время блокировки (-1 значит "учётная запись включена")

поле 9 #Зарезервировано на будущее

Файл /etc/group

Следующее на что мы посмотрим, это файл /etc/group, который определяет все группы в Linux. В качестве примера рассмотрим такую строку:

drobbins:x:1000:

Поля в файле /etc/group имеют уже рассмотренный нами формат. Первое поля указывает на название группы, второе поле содержит несуществующий пароль, заменённое символом "икс". Третье поле, как и в примерах выше указывает на идентификатор группы к которой он принадлежит. Четвёртое поле (в нашем примере оно пустое) содержит список пользователей, которые входят в эту группу.

Как вы помните, в примере с файлом /etc/passwd была строка указывающая на идентификатор группы равный 1000. Это является эффектом того, что пользователь drobbins находится в группе drobbins, несмотря на то, что имени drobbins нету в четвёртом поле файла /etc/groups.

Примечания к группам

Сделаю кое-какие примечания связанных с привязкой пользователей к группам: на некоторых системах можно обратить внимание на то, что каждая новая учётная запись пользователя связана с одинаково названным (обычно, ещё и одинаково пронумерованным) группам. На других системах все новые учётные записи помещаются в отдельную выделенную группу для пользователей. Подход используемый для администрирования системы зависит только от вас. создание отдельной группы для каждого пользователя на практике упрощает контроль за файлами путём помещения тех людей, которым вы доверяете в свои персональные группы.

Добавление пользователей и групп вручную

А теперь настало время показать, как можно создавать собственные учётные записи и группы. Самый лучший способ научиться этому, это добавить пользователя вручную. Перед там как начать, необходимо удостовериться, что ваша переменная 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. Мы также добавили его в группу имеющую GID (идентификатор группы) равным 3000, которую мы никогда не создавали до этого. Как вариант, мы может назначить GID от другой группы, если мы пожелаем. К новому пользователю добавлен комментарий который переводится как "Учебный тестовый пользователь для LPI". Домашняя директория для этого пользователя находится в /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: (enter a password for testuser)
Retype new UNIX password: (enter testuser's new password again)

Правим файл /etc/group

Теперь, когда мы отредактировали файлы /etc/passwd и /etc/shadow, настало время правильно настроить /etc/group. Чтобы выполнить это, наберите:

# vigr

Перед вами должен появиться файл /etc/group готовый к правке. Если вы хотите назначить стандартную группу для нового пользователя, то добавлять новые группы в /etc/group не требуется. Однако, если же мы хотим создать новую группу для этого пользователя, то необходимо проделать следующее:

testuser:x:3000:

Сохраняемся. Выходим.

Создание домашнего каталога

Мы почти закончили. Введите следующие команды необходимые для создания домашенго каталога:

# cd /home
# mkdir testuser
# chown testuser.testuser testuser
# chmod o-rwx testuser

Теперь наша директория находится там где надо и можно приступить к работе. Ну, не совсем. Если вы планируете использовать эту учётную запись в своей работе, то вам потребуется команда vipw, чтобы изменить используемую по умолчанию командную оболочку на /bin/bash.

Полезные программы для управления учётными записями

Теперь, когда мы научились создавать учётные записи вручную, настало время познакомиться с некоторыми полезными и экономящими время программами доступными в Linux. Дабы сэкономить уйму места, мы не будем описывать действие этих программ в подробностях. Просто помните, что вы всегда сможете получить необходимую информацию по этим программам воспользовавшись справкой. Если планируете сдавать экзамен LPIC 101, то я крайне рекомендую потратить время на более близкое знакомство с каждой из этих команд.

Команда newgrp

По умолчанию, любые файлы создаваемые пользователем назначаются в ту группу, которая которая указана в файле /etc/passwd и куда входит нужный нам пользователь. Если пользователь состоит в других группах, то он или она могут ввести команду newgrp thisgroup, чтобы сменить текущее членство в группе по умолчанию. В дальнейшем, все новые файлы будут наследовать атрибуты другой указанной группы.

chage Команда chage необходима для просмотра и изменений возраста паролей сохранённых в файле /etc/shadow.

gpasswd Основная программа для управления группами

groupadd/groupdel/groupmod Используется для добавления/удаления/редактирования групп в файле /etc/group

useradd/userdel/usermod Используется для добвления/удаления/редактирования пользователей в файле /etc/passwd. Эти программы имеют и другие возможности, о которых можно узнать из справки.

pwconv/grpconv Используется для конвертирования файлов passwd и group в теневые пароли "нового формата". Все новые Linux-системы по умолчению имеют такие пароли, так что вам не надо пользоваться ими.

"Тонкая" настройка пользовательского окружения

Знакомимся с программой fortune

Ваша командная оболочка имеет множество полезных возможностей, которые можно использовать для создания персональных настроек. Однако, мы ещё ни разу не затрагивали способов задания этих настроек автоматическим способом, при каждом входе в систему, кроме повторного набора команды. Данный раздел расскажет вам о том, как настраивать пользовательское окружение с помощью файлов автозагрузки.

Давайте для примера добавим приветственное сообщение появляющееся при каждом первом входе в систему. Дабы посмотреть на пример такого сообщения, достаточно набрать команду

fortune.$ fortune
No amount of careful planning will ever replace dumb luck.

Файл .bash_profile

Теперь настроим программу forune на автозапуск при каждом входе в систему. Используйте ваш текстовый редактор для редактирования файла .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 действует в зависимости от того, каким способом он был запущен. Если он запускается как штатная оболочка при входе в систему, то он будет отрабатывать как в примере выше - сначала прочитает общесистемный /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

Вероятнее всего, ваш листинг будет длиннее, но как минимум, вы увидите хоть один процесс в поле COMMAND с чертой перед именем процесса вашей оболочки вроде "-bash" как в примере выше. Данная черта используется для того, чтобы определить, что командный интерпретатор запущен в качестве оболочки для входа в систему.

Изучаем опцию --login

Второй способ указать командному интерпретатору, что нужно запуститься в режиме оболочки - это использовать опцию --login. Этот способ используется некоторыми эмуляторами терминала, например, xterm, чтобы каждая сессия bash работала как отдельная попытка входа в систему.

После входа в систему запускается ещё несколько копий оболочки. Несмотря на то, что эти сессии запускаются с параметром --login, и имеют черту перед своим именем, они не являются оболочками для входа. Если они выдают вам приглашение командной строки, то такие оболочки называются интерактивными. В интерактивном режиме bash полностью игнорирует файлы /etc/profile и ~/.bash_profile, но зато просматривает файл ~/.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, что в свою очередь, может помешать работе неинтерактивной сессии bash. Поэтому хорошим тоном было бы использование переменной PS1, чтобы определять, работает ли запущенная сессия в интерактивном режиме или нет, перед тем как вывести текст на экран.

if [ -n "$PS1" ]; then
fortune
fi

Файлы /etc/profile и /etc/skel

Как системный администратор, вы отвечаете за файл /etc/profile. Поскольку данный файл просматривается всеми пользователями, то крайне необходимо, чтобы данный файл был корректным. Это, кроме всего прочего, ещё и серьёзный инструмент позволяющий обеспечить правильную работу профилей новых пользователей, когда они совершают свой первый вход в систему.

Существуют также некоторые настройки обеспечивающие установку определённых умолчаний для всех новых пользователей, но при этом также легко меняющие их. Они находятся в каталоге /etc/skel. Когда вы выполняете команду useradd, то все файлы копируются в домашний каталог нового пользователя. Что означает возможность вставки чего-нибудь полезного в файлы .bash_profile и .bashrc находящихся в каталоге /etc/skel для начала.

Команда export

Переменные в командном интерпретаторе 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 была помечена на экспорт. Когда запустилась новая сессия bash,то он значение выставленное для переменной FOO было утеряно. Если же вы выйдете из этой новой сессии, то увидите изначальные значения переменных для FOO и BAR:

$ exit
$ echo $FOO $BAR
foo bar

Команды export и set -x

Как и в предыдущем случае, переменные могут быть заданы в файлах ~/.bash_profile или /etc/profile, помечены на экспорт и более никогда не трогаться. Но дело в том, что некоторые опции не могут быть экспортированы, поэтому необходимо в нужной последовательности вложить их сначала в ~/.bashrc а затем в ваш профиль.Подобную настройку можно произвести с помощью встроенной команды set:

$ set -x

Опция -x говорит bash, что требуется печатать каждую команду перед её запуском.

$ echo $FOO
$ echo foo
foo

Это позволяет также объяснить непредвиденное появление кавычек, или другие странности. Чтобы отключить опцию -x необходимо дать команду set +x. Для более подробной информации рекомендуем просмотреть справочную странцу bash по параметрам встроенной команды set.

Настройка переменных с помощью команды set

Встроенная команда set тоже может устанавливать значения переменных, правда, это возможность для неё побочная. Команда bash set FOO=foo означает то же самое, что FOO=foo. Чтобы снять значение переменной, достаточно воспользоваться командой unset:

$ FOO=bar
$ echo $FOO
bar
$ unset FOO
$ echo $FOO

Использование Unset вместо 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, то можно листать страницы нажимая клавишу "пробел". Если же указать в переменнной PAGES команду cat, то текст будет прокручен целиком без остановки.

$ PAGER=cat
$ man man

Использование команды env

Если вы вдруг забыли установить значение переменной PAGER обратно на less, то команда man будет показывать все тексты одним куском, без возможности прокрутки. Если вам нужно установить cat в качестве значения переменной всего на один раз, то нужно использовать команду env:

$ PAGER=less
$ env PAGER=cat man man
$ echo $PAGER
less

В этом случае, команда man будет использовать получит значение переменной PAGER cat, но само значение переменной внутри сессии bash останется неизменным.

Заключение и ресурсы

Заключение

Наши поздравления касающиеся завершения третьей части данного руководства! Начиная с этого момента, вы теперь знаете как находить информацию в системе и сети Интернет, а также получили достаточно хорошее представление о модели разрешений используемой в операционной системе Linux, управлении учётными записями и настройке пользовательского окружения.

Ресурсы

Будьте готовы к изучению различных ресурсов с документацей о Linux, о которой мы немного поговорили на страницах данного руководства - The Linux Documentation Project. Там вы найдёте бесценные сборники других руководств, HOWTO, ЧАВо и справочные страницы. Периодически заглядывайте на Linux Weekly News.

Руководство по системному администрированию Linux доступное в разделе "Руководства" является отменным дополнением к этой серии руководств - крайне рекомендую к прочтению! Весьма полезной может оказаться работа "HOWTO по основам Unix и сети Internet" Эрика Рэймонда.

В серии статей "Bash в примерах" Дэниэл Роббинс покажет вам, как использовать конструкции языка командного интерпретатора Bash для написания собственных сценариев. Эта серия статей (первая и вторая части) будет хорошим подспорьем при подготовке к экзамену первого уровня LPIC и объясняет идеи изложенные в разделе "Настройка пользовательского окружения" этой статьи.

Если вы не знакомы с редактором vi, то рекомендуем ознакомиться с материалом "Введение в Vi. Шпаргалка-методичка". Данный учебник быстро и мягко введёт в в основы использования этого крайне мощного текстового редактора. Рассмотривайте этот материал, как крайне необходимый для изучения, если вы никогда до этого не работали с vi.

Для тех, кого интересует Emacs можем порекомендовать статью с IBM DeveloperWorks "Жизнь in Emacs".


Автор текста: Дэниэл Роббинс

Перевод: Буданов Евгений aka r0g3r