Текст книги "Внутреннее устройство Linux"
Автор книги: Брайан Уорд
Жанры:
Программное обеспечение
,сообщить о нарушении
Текущая страница: 3 (всего у книги 30 страниц) [доступный отрывок для чтения: 11 страниц]
2.9. Командный путь
PATH является специальной переменной окружения, которая содержит командный путь, или просто путь. Командный путь – это перечень системных каталогов, которые просматривает оболочка, пытаясь найти какую-либо команду. Например, когда вы запускаете команду ls, оболочка просматривает каталоги, перечисленные в переменной PATH, в поисках команды ls. Если команда встречается сразу в нескольких каталогах, оболочка запустит первый найденный экземпляр.
Если вы запустите команду echo $PATH, вы увидите, что компоненты пути отделены с помощью двоеточия (:). Например, так:
$ echo $PATH
/usr/local/bin:/usr/bin:/bin
Чтобы указать оболочке дополнительные места для поиска команд, измените переменную окружения PATH. Например, с помощью приведенной ниже команды можно добавить в начало пути каталог dir, чтобы оболочка начала просмотр каталогов с него, до других каталогов из переменной PATH.
$ PATH=dir:$PATH
Можно также добавить название каталога в конец переменной PATH, тогда оболочка обратится к нему в последнюю очередь:
$ PATH=$PATH:dir
примечание
Будьте осторожны при изменении пути, поскольку вы можете случайно полностью стереть его, если неправильно наберете $PATH. Если это случилось, не следует паниковать. Ущерб не является необратимым, вы можете просто запустить новую оболочку. Чтобы сильнее нарушить работу, необходимо сделать ошибку при редактировании некоторого файла конфигурации, но даже и в этом случае ее нетрудно исправить. Один из простейших способов вернуться в нормальное состояние – закрыть текущее окно терминала и открыть другое.
2.10. Специальные символы
Вам следует знать названия некоторых специальных символов системы Linux. Если вам нравятся вещи подобного рода, загляните на страницу Jargon File (http://www.catb.org/jargon/html/) или посмотрите ее печатную версию в книге The New Hacker’s Dictionary («Новый словарь хакера») (MIT Press, 1996).
В табл. 2.1 описан набор специальных символов, многие из них вы уже встречали в этой главе. Некоторые утилиты, например язык программирования Perl, используют почти все эти символы! Помните о том, что здесь приведены американские варианты названий символов.
Таблица 2.1. Специальные символы
Символ
Название
Применение
*
Звездочка
Регулярные выражения, джокерные символы
.
Точка
Текущий каталог, разделитель имени файла и хоста
!
Восклицательный знак
Отрицание, история команд
|
Вертикальная черта
Командный конвейер
/
Прямой слеш
Разделитель каталогов, команда поиска
Обратный слеш
Литералы, макросы (но не каталоги)
$
Доллар
Обозначение переменной, конец строки
'
Одиночная кавычка
Буквенные строки
`
«Обратная галочка»
Замена команды
"
Двойная кавычка
Частично буквенные строки
^
Знак вставки
Отрицание, начало строки
~
Тильда
Отрицание, ярлык каталога
#
Диез, знак фунта
Комментарии, препроцессор, подстановки
[ ]
Квадратные скобки
Массивы
{ }
Фигурные скобки
Блоки инструкций, массивы
_
Подчеркивание
Просто замена символа пробела
примечание
Вам часто будут встречаться символы, снабженные знаком вставки; например, ^C вместо Ctrl+С.
2.11. Редактирование командной строки
Во время работы с оболочкой обратите внимание, что вы можете редактировать командную строку, используя клавиши и , а также перемещаться к предыдущим командам с помощью клавиш и . Такой способ работы является стандартным в большинстве систем Linux.
Кроме того, вместо них можно применять управляющие сочетания клавиш. Если вы запомните сочетания, перечисленные в табл. 2.2, то обнаружите, что у вас появились дополнительные возможности ввода текста во многих командах Unix по сравнению с использованием стандартных клавиш.
Таблица 2.2. Сочетания клавиш для командной строки
Сочетание клавиш
Действие
Ctrl+B
Перемещение курсора влево
Ctrl+F
Перемещение курсора вправо
Ctrl+P
Просмотр предыдущей команды (или перемещение курсора вверх)
Ctrl+N
Просмотр следующей команды (или перемещение курсора вниз)
Ctrl+A
Перемещение курсора в начало строки
Ctrl+E
Перемещение курсора в конец строки
Ctrl+W
Удаление предыдущего слова
Ctrl+U
Удаление текста от курсора до начала строки
Ctrl+K
Удаление текста от курсора до конца строки
Ctrl+Y
Вставка удаленного текста (например, после команды CTRL+U)
2.12. Текстовые редакторы
Для работы в системе Unix вы должны уметь редактировать текстовые файлы, не повреждая их. Большинство частей системы использует для конфигурации простые текстовые файлы (подобные тем, которые расположены в каталоге /etc). Редактировать их несложно, но вам предстоит делать это часто, поэтому понадобится мощный инструмент.
Попробуйте освоить один из двух редакторов, которые де-факто являются стандартом для системы Unix: vi и Emacs. Большинство «кудесников» Unix относятся к выбору редактора с большим трепетом. Не прислушивайтесь к ним – выбирайте редактор сами, вам будет проще его освоить.
При выборе редактора принимайте во внимание следующие моменты.
• Если вам необходим редактор, который может практически все, а также обладает обширной справочной системой и при этом вы не возражаете против набора дополнительных символов для использования различных функций, попробуйте редактор Emacs.
• Если скорость работы превыше всего, выберите редактор vi. Работа в нем чем-то напоминает видеоигру.
ПРИМЕЧАНИЕ
Книга Learning the vi and Vim Editors: Unix Text Processing («Изучаем редакторы vi и Vim: работа с текстом в системе Unix»), 7-е издание (O’Reilly, 2008), расскажет вам все, что необходимо знать о редакторе vi. В редакторе Emacs можно воспользоваться справочной системой, запустив редактор, а затем нажав сочетание клавиш Ctrl+H и клавишу T. Можно также почитать книгу GNU Emacs Manual («Руководство по редактору GNU Emacs») (Free Software Foundation, 2011).
У вас может появиться искушение поэкспериментировать на начальных этапах с более дружественным редактором, таким как Pico или одним из множества имеющихся GUI-редакторов. Однако, если вы сразу привыкаете к программе, лучше не следовать такой практике.
примечание
Именно при редактировании текста вы впервые увидите отличие терминала от графического интерфейса пользователя. Редакторы вроде vi запускаются внутри окна терминала с помощью стандартного интерфейса ввода/вывода. Редакторы с графическим интерфейсом запускаются в собственном окне, которое не зависит от терминала и снабжено собственным интерфейсом. Редактор Emacs по умолчанию запускается в GUI-режиме, но может быть запущен и в окне терминала.
2.13. Получение интерактивной справки
Операционные системы Linux снабжены документацией. Страницы руководства расскажут вам обо всем необходимом для основных команд. Например, чтобы увидеть страницу руководства по команде ls, введите следующий запрос:
$ man ls
Большинство страниц руководства содержат главным образом справочную информацию, возможно, с некоторыми примерами и перекрестными ссылками. Не ожидайте увидеть учебное пособие и не рассчитывайте на воодушевляющий литературный стиль.
Когда у команды много параметров, они перечисляются на странице руководства в каком-либо систематизированном виде (например, в алфавитном порядке). Степень их важности при этом определить невозможно. Если вы достаточно терпеливы, то в большинстве случаев сможете найти все необходимые сведения в руководстве.
Чтобы выполнить поиск на странице руководства по ключевому слову, используйте параметр -k:
$ man -k keyword
Это полезно, если вы не вполне уверены в названии необходимой команды. Например, если вы ищете команду для сортировки чего-либо, введите следующее:
$ man -k sort
–snip—
comm (1) –сравнивает два отсортированных файла строка за строкой
qsort (3) –сортирует массив
sort (1) –сортирует строки текстового файла
sortm (1) –сортирует сообщения
tsort (1) –выполняет топологическую сортировку
–snip—
Результат включает название страницы руководства, раздел руководства (см. ниже), а также краткое описание того, что содержит данная страница руководства.
примечание
Если у вас есть какие-либо вопросы насчет команд, рассмотренных в предыдущих разделах, можете попробовать найти ответы с помощью команды man.
На страницы руководства ссылаются с помощью пронумерованных разделов. Когда кто-либо приводит ссылку на страницу руководства, то в скобках после названия указывается номер раздела, например, так: ping(8). В табл. 2.3 перечислены все разделы с их нумерацией.
Таблица 2.3. Разделы интерактивного руководства
Раздел
Описание
1
Команды пользователя
2
Системные вызовы
3
Документация к высокоуровневой программной библиотеке Unix
4
Интерфейс устройств и информация о драйверах
5
Описание файлов (файлы конфигурации системы)
6
Игры
7
Форматы файлов, условные обозначения и кодировки (ASCII, суффиксы и т. д.)
8
Системные команды и серверы
Разделы 1, 5, 7 и 8 служат хорошим дополнением к данной книге. Раздел 4 может пригодиться в редких случаях, а раздел 6 был бы замечателен, если бы его сделали немного больше. Вероятно, вы не сможете воспользоваться разделом 3, если вы не программист, однако вам удастся понять раздел 2, когда вы узнаете из этой книги немного больше о системных вызовах.
Вы можете выбрать страницу руководства по разделу. Это важно, поскольку система отображает первую из страниц, на которой ей удается обнаружить нужное понятие. Например, чтобы прочитать описание файла /etc/passwd (а не команды passwd), можно добавить номер раздела перед названием страницы:
$ man 5 passwd
Страницы руководства содержат основные сведения, но есть и другие способы получить интерактивную справку. Если вам необходимо узнать что-либо о параметре команды, введите название команды, а затем добавьте параметр —help или -h (варианты различны для разных команд). В результате вы можете получить множество ответов (как, например, в случае с командой ls —help) или, возможно, сразу то, что нужно.
Когда-то участники проекта GNU Project решили, что им не очень нравятся страницы руководства, поэтому появился другой формат справки – info (или texinfo). Зачастую объем этой документации больше, чем у обычных страниц руководства, и иногда она более сложная. Чтобы получить доступ к этой информации, введите команду info и укажите название команды:
$ info command
Некоторые версии системы сваливают всю доступную документацию в каталог /usr/share/doc, не заботясь о предоставлении какой-либо справочной системы вроде man или info. Загляните в этот каталог, если вам необходима документация, и, конечно же, поищите в Интернете.
2.14. Ввод и вывод с помощью оболочки
Теперь, когда вы знакомы с основными командами системы Unix, файлами и каталогами, вы готовы к изучению перенаправления стандартных ввода и вывода. Начнем со стандартного вывода.
Чтобы направить результат команды command в файл, а не в терминал, используйте символ перенаправления >:
$ command > file
Оболочка создаст файл file, если его еще нет. Если такой файл существует, то оболочка сначала сотрет его (затрет данные). Некоторые оболочки снабжены параметрами, предотвращающими затирание данных. В оболочке bash, например, наберите для этого set –C.
Вы можете добавить выводимые данные к файлу вместо его перезаписи с помощью такого синтаксиса перенаправления >>:
$ command >> file
Это удобный способ собрать все выходные данные в одном месте, когда выполняется последовательность связанных команд.
Чтобы отправить стандартный вывод какой-либо команды на стандартный вход другой команды, используйте символ вертикальной черты (|). Чтобы понять, как он работает, попробуйте набрать следующие команды:
$ head /proc/cpuinfo
$ head /proc/cpuinfo | tr a-z A-Z
Можно пропустить выходные данные через любое количество команд. Для этого добавляйте вертикальную черту перед каждой дополнительной командой.
2.14.1. Стандартная ошибка
Иногда при перенаправлении стандартного вывода вы можете обнаружить, что команда выводит в терминал что-то еще. Это называется стандартной ошибкой (stderr). Она является дополнительным выходным потоком для диагностики и отладки.
Например, такая команда вызовет ошибку:
$ ls /fffffffff > f
После ее выполнения файл f должен быть пустым, однако вы увидите в терминале следующее сообщение стандартной ошибки:
ls: cannot access /fffffffff: No such file or directory
Если желаете, можете перенаправить стандартную ошибку. Чтобы, например, отправить стандартный вывод в файл f, а стандартную ошибку в файл e, используйте синтаксис 2> следующим образом:
$ ls /fffffffff > f 2> e
Число 2 определяет идентификатор потока, который изменяет оболочка. Значение 1 соответствует стандартному выводу (по умолчанию), а значение 2 – стандартной ошибке.
Вы можете также направить стандартную ошибку туда же, куда осуществляется стандартный вывод, с помощью нотации >&.
Например, чтобы отправить стандартный вывод и стандартную ошибку в файл f, попробуйте такую команду:
$ ls /fffffffff > f 2>&1
2.14.2. Перенаправление стандартного ввода
Чтобы отправить файл на стандартный ввод команды, используйте оператор <:
$ head < /proc/cpuinfo
Вам может встретиться команда, которой потребуется указанный выше тип перенаправления, но поскольку большинство команд системы Unix принимает имена файлов в качестве аргументов, такое происходит нечасто. Эту команду можно было бы переписать в виде head /proc/cpuinfo.
2.15. Объяснение сообщений об ошибках
Когда у вас возникают проблемы при работе в системе, похожей на Unix (например, в Linux), вы должны читать сообщения об ошибках. В отличие от сообщений в других операционных системах, в системе Unix ошибки, как правило, точно указывают вам на то, что именно вышло из строя.
2.15.1. Структура сообщений об ошибке в Unix
Большинство команд системы Unix выдает одинаковые основные сообщения об ошибках, однако окончательный вид может немного различаться для разных команд. Вот пример сообщения, которое в том или ином виде обязательно вам встретится:
$ ls /dsafsda
ls: cannot access /dsafsda: No such file or directory
Это сообщение состоит из трех частей.
• Название команды: ls. Некоторые команды опускают такую идентифицирующую информацию, и это может раздражать при написании сценариев оболочки, хотя, по сути, это не так уж и важно.
• Имя файла, /dsafsda, которое является более конкретной информацией. Указанный путь содержит ошибку.
• Сообщение об ошибке No such file or directory указывает на ошибку в имени файла.
Если собрать эти части воедино, получится нечто вроде «команда ls пыталась открыть файл /dsafsda, но не смогла, поскольку такого файла нет». Это может казаться очевидным, однако подобные сообщения сбивают с толку, если вы запустите сценарий оболочки, который содержит ошибку в другой команде.
При устранении ошибок всегда начинайте разбираться с первой ошибки. Некоторые команды сообщают о том, что они ничего не смогут сделать до выяснения причин других ошибок. Представьте, например, что вы запускаете выдуманную команду под названием scumd, которая выдает такое сообщение об ошибке:
scumd: cannot access /etc/scumd/config: No such file or directory
За ним следует огромный перечень других сообщений об ошибках, который выглядит катастрофически. Не отвлекайтесь на остальные ошибки. Скорее всего, вам всего лишь надо создать файл /etc/scumd/config.
примечание
Не смешивайте сообщения об ошибках с предупреждениями. Предупреждения часто выглядят как ошибки, но они содержат слово warning. Они говорят о наличии какой-либо неисправности, однако команда будет пытаться продолжить работу. Чтобы устранить проблему, указанную в предупреждении, вам потребуется отыскать ошибочный процесс и завершить его, прежде чем делать что-либо еще (о списке процессов и об их завершении вы узнаете из раздела 2.16).
2.15.2. Общие ошибки
Многие ошибки, которые вы встретите при выполнении команд системы Unix, являются результатом неправильных действий с файлами или процессами. Приведем «хит-парад» сообщений об ошибках.
No such file or directory
Вероятно, вы пытались получить доступ к несуществующему файлу. Поскольку ввод/вывод в системе Unix не делает различий между файлами и каталогами, это сообщение об ошибке появляется везде. Вы получите его, если попытаетесь выполнить чтение несуществующего файла, или решите перейти в отсутствующий каталог, или попробуете записать файл в несуществующий каталог и т. д.
File exists
В данном случае вы, возможно, пытались создать файл, который уже существует. Это часто бывает, когда вы создаете каталог, имя которого уже занято каким-либо файлом.
Not a directory, Is a directory
Эти сообщения возникают, когда вы пытаетесь использовать файл в качестве каталога или каталог в качестве файла. Например, так:
$ touch a
$ touch a/b
touch: a/b: Not a directory
Обратите внимание на то, что сообщение об ошибке относится только к части a пути a/b. Когда вы столкнетесь с такой проблемой, вам потребуется время, чтобы отыскать компонент пути, с которым обращаются как с каталогом.
No space left on device
На вашем жестком диске закончилось свободное пространство.
Permission denied
Эта ошибка возникает, когда вы пытаетесь выполнить чтение или запись, указав файл или каталог, к которым вам не разрешен доступ (вы обладаете недостаточными правами). Эта ошибка говорит также о том, что вы пытаетесь запустить файл, для которого не установлен бит выполнения (даже если вы можете читать этот файл). Из раздела 2.17 вы больше узнаете о правах доступа.
Operation not permitted
Обычно такая ошибка возникает, когда вы пытаетесь завершить процесс, владельцем которого не являетесь.
Segmentation fault, Bus error
Суть ошибки сегментации состоит в том, что разработчик программы, которую вы только что запустили, где-то ошибся. Программа пыталась получить доступ к области памяти, к которой ей не разрешено обращаться, в результате операционная система завершила работу программы. Подобно ей, ошибка шины означает, что программа пыталась получить доступ к памяти недолжным образом. Если вы получаете одну из этих ошибок, то, вероятно, вы передали на ввод программы какие-либо неожиданные для нее данные.
2.16. Получение списка процессов и управление ими
Процесс – это работающая программа. Каждому процессу в системе присвоен числовой идентификатор процесса (PID). Чтобы быстро получить перечень работающих процессов, запустите команду ps. Вы получите результат вроде этого:
$ ps
PID TTY STAT TIME COMMAND
520 p0 S 0:00 -bash
545 ? S 3:59 /usr/X11R6/bin/ctwm -W
548 ? S 0:10 xclock -geometry -0-0
2159 pd SW 0:00 /usr/bin/vi lib/addresses
31956 p3 R 0:00 ps
Эти поля означают следующее.
• PID – идентификатор процесса.
• TTY – оконечное устройство, в котором запущен процесс (об этом подробнее чуть позже).
• STAT – статус процесса, а именно: что выполняет данный процесс и где расположена отведенная для него память. Например, символ S обозначает ждущий процесс, а символ R – работающий (описание всех символов можно найти на странице ps(1) в руководстве).
• TIME – количество времени центрального процессора в минутах и секундах, которое использовал данный процесс к настоящему моменту. Другими словами, это общее количество времени, потраченное процессом на выполнение инструкций в процессоре.
• COMMAND – поле может показаться очевидным, однако имейте в виду, что процесс может изменить исходное значение этого поля.
2.16.1. Параметры команды ps
Команда ps обладает множеством параметров. Чтобы запутать дело еще больше, можно указывать параметры в трех разных стилях: Unix, BSD и GNU. Многие пользователи считают, что стиль BSD наиболее удобен (вероятно, в силу большей краткости набора), поэтому в данной книге мы будем применять именно его. В табл. 2.4 приведено несколько наиболее полезных сочетаний параметров.
Таблица 2.4. Параметры команды ps
Команда с параметром
Описание
ps x
Показать все процессы, запущенные вами
ps ax
Показать все процессы системы, а не только те, владельцем которых являетесь вы
ps u
Включить детализированную информацию о процессах
ps w
Показать полные названия команд, а не только те, что помещаются в одной строке
Как и в других командах, эти параметры можно комбинировать, например, так: ps aux или ps auxw. Чтобы проверить какой-либо конкретный процесс, добавьте значение PID к списку аргументов команды ps. Например, чтобы просмотреть информацию о текущем процессе оболочки, можно использовать команду ps u $$, поскольку параметр $$ является переменной оболочки, которая содержит значение PID текущего процесса. В главе 8 вы найдете информацию о командах администрирования top и lsof. Они могут пригодиться при локализации процессов, причем не обязательно тогда, когда необходимо заниматься обслуживанием системы.
2.16.2. Завершение процессов
Чтобы завершить процесс, отправьте ему сигнал с помощью команды kill. Сигнал – это сообщение процессу от ядра. Когда вы запускаете команду kill, вы просите ядро отправить сигнал другому процессу. В большинстве случаев для этого необходимо набрать следующее:
$ kill pid
Существует много типов сигналов. По умолчанию используется сигнал TERM («прервать»). Вы можете отправлять другие сигналы, добавляя параметр в команду kill. Например, чтобы приостановить процесс, не завершая его, применяйте сигнал STOP:
$ kill -STOP pid
Остановленный процесс остается в памяти и ожидает повторного вызова. Используйте сигнал CONT, чтобы продолжить выполнение этого процесса:
$ kill -CONT pid
примечание
Применение сочетания клавиш Ctrl+С для прерывания процесса, работающего в терминале, равносильно вызову команды kill для завершения процесса по сигналу INT («прервать»).
Самый грубый способ завершения процесса – с помощью сигнала KILL. Другие сигналы дают процессу шанс прибрать за собой, а сигнал KILL – нет. Операционная система прерывает процесс и принудительно выгружает его из памяти. Используйте это в качестве последнего средства. Не следует завершать процессы без разбора, особенно если вы не знаете, что они делают.
Вы можете увидеть, что некоторые пользователи вводят числа вместо названий параметров команды kill. Например, kill -9 вместо kill -KILL. Это объясняется тем, что ядро использует числа для обозначения различных сигналов. Можете применять команду kill подобным образом, если вам известно число, которое соответствует необходимому сигналу.
2.16.3. Управление заданиями
Оболочка поддерживает также управление заданиями – один из способов отправки командам сигналов TSTP (подобен сигналу STOP) и CONT с помощью различных сочетаний клавиш и команд. Например, вы можете отправить сигнал TSTP с помощью сочетания клавиш Ctrl+Z, а затем возобновить процесс командой fg (вывести из фона) или bg (перевести в фон; см. следующий раздел). Несмотря на практичность управления заданиями и его привычное использование многими опытными пользователями, оно не является необходимым и может запутать начинающих. Очень часто пользователи нажимают сочетание Ctrl+Z вместо Ctrl+С, забывают о запущенных процессах и в итоге получают множество «подвешенных» процессов.
совет
Чтобы узнать, не висят ли в текущем терминале приостановленные процессы, выполните команду jobs.
Если вы намерены использовать несколько оболочек, запустите каждую из них в отдельном окне терминала, переведите в фон неинтерактивные процессы (см. следующий раздел) или научитесь использовать команду screen.
2.16.4. Фоновые процессы
Обычно при запуске из оболочки команды в системе Unix вы не увидите строки приглашения, пока команда не завершит работу. Тем не менее можно отделить процесс от оболочки и поместить его в «фон» с помощью символа амперсанда (&); после этого строка приглашения вернется. Если вам необходимо распаковать большой архив с помощью команды gunzip (о ней вы узнаете из раздела 2.18), а тем временем вы намерены заняться чем-либо другим, запустите команду такого вида:
$ gunzip file.gz &
Оболочка должна в ответ выдать номер PID нового фонового процесса, а строка приглашения появится немедленно, чтобы вы смогли работать далее. Процесс продолжит свое выполнение и после того, как вы выйдете из системы. Это чрезвычайно удобно, если приходится запускать программу, которая производит довольно много вычислений. В зависимости от настроек системы оболочка может уведомить вас о завершении процесса.
Обратной стороной фоновых процессов является то, что они могут ожидать начала работы со стандартным вводом (и, хуже того, выполнять чтение прямо из терминала). Если фоновая программа пытается считывать что-либо из стандартного ввода, она может зависнуть (попробуйте команду fg, чтобы вызвать ее из фона) или прекратить работу. К тому же, если программа выполняет запись в стандартный вывод или стандартную ошибку, все это может отобразиться в терминале вне всякой связи с какими-либо выполняемыми командами: вы можете увидеть неожиданный результат, пока работаете над чем-то другим.
Лучший способ добиться того, чтобы фоновый процесс не беспокоил вас, – перенаправить его вывод (и, возможно, ввод), как описано в разделе 2.14.
Узнайте о том, как обновить окно терминала. Оболочка bash и большинство полноэкранных интерактивных программ поддерживают сочетание клавиш Ctrl+L для повторной отрисовки всего экрана. Если программа производит считывание из стандартного ввода, сочетание клавиш Ctrl+R обычно обновляет текущую строку, однако нажатие неверного сочетания в неподходящий момент может привести вас к более печальной ситуации, чем была раньше. Нажав, например, Ctrl+R в строке приглашения оболочки bash, вы окажетесь в режиме реверсивного поиска isearch mode (для выхода из него нажмите клавишу Esc).
2.17. Режимы файлов и права доступа
Каждый файл системы Unix обладает набором прав доступа, которые определяют, можете ли вы читать, записывать или запускать данный файл. Команда ls -l отображает эти права доступа. Вот пример такой информации:
–rw-r—r— 1 juser somegroup 7041 Mar 26 19:34 endnotes.html
Режим файла представляет права доступа и некоторые дополнительные сведения. Режим состоит из четырех частей, как показано на рис. 2.1. Первый символ в режиме обозначает тип файла. Дефис (-) на этом месте, как в примере, указывает на то, что файл является обычным и не содержит никаких особенностей. Безусловно, это самый распространенный тип файлов. Каталоги также весьма обычны и обозначаются символом d в позиции, указывающей тип файла (в разделе 3.1).
Оставшаяся часть режима файла содержит сведения о правах доступа, которые разделены на три группы: права пользователя, права группы и другие права – в указанном порядке. Символы rw– в приведенном примере относятся к правам доступа пользователя, за ними следуют символы r—, определяющие права доступа для группы, и, наконец, символы r– определяют другие права доступа.
Каждый из наборов прав доступа может содержать четыре основных обозначения (табл. 2.5).
Рис. 2.1. Составляющие режима файла
Таблица 2.5. Обозначение прав доступа
Обозначение
Описание
r
Файл доступен для чтения
w
Файл доступен для записи
x
Файл является исполнимым (можно запустить его как программу)
–
Ничего не обозначает
Права доступа пользователя (первый набор символов) относятся к пользователю, который является владельцем файла. В приведенном выше примере это juser. Второй набор символов относится к группе (в данном случае somegroup). Любой пользователь из этой группы обладает указанными правами доступа. Воспользуйтесь командой groups, чтобы узнать, в какую группу вы входите. Дополнительную информацию можно получить в подразделе 7.3.5.
В третьем наборе (другие права доступа) указано, кто еще будет обладать в системе правами доступа. Их часто называют правами доступа для всех.
примечание
Каждая позиция, содержащая обозначение права доступа на чтение, записи или исполнение, иногда называется битом прав доступа. По этой причине вы можете слышать, как пользователи упоминают про «биты доступа для чтения».
У некоторые исполняемых файлов в правах доступа пользователя вместо символа x указан символ s. Это говорит о том, что исполняемый файл является файлом setuid – при его выполнении он запускается так, словно владельцем файла является пользователь с указанным идентификатором, а не вы. Многие команды используют бит setuid, чтобы получить корневые права доступа, необходимые для изменения системных файлов. В качестве примера можно привести команду passwd, которой необходимо изменять файл /etc/passwd.
2.17.1. Изменение прав доступа
Чтобы изменить права доступа, используйте команду chmod. Сначала укажите набор прав, который вы желаете изменить, а затем укажите бит, подлежащий изменению. Например, чтобы добавить права доступа на чтение файла для группы (g) и всех пользователей (o, по первой букве слова other – «остальные»), нужно запустить следующие две команды:
$ chmod g+r file
$ chmod o+r file
Можно также объединить их таким образом:
$ chmod go+r file
Чтобы удалить эти права доступа, используйте go-r вместо go+r.
примечание
Довольно очевидно, что не следует предоставлять всем пользователям права доступа на запись файла, поскольку каждый получит возможность изменить системные файлы. Но сможет ли при этом кто-либо, подключившись через Интернет, изменить ваши файлы? Вероятно, не сможет, если только в вашей системе нет уязвимости в сетевой защите. Если же она уязвима, то права доступа к файлам ничем вам не помогут.
Иногда пользователи меняют права доступа, указывая числа, например, так:
$ chmod 644 file
Такой способ называется абсолютным изменением, поскольку при нем сразу же устанавливаются все биты прав доступа. Чтобы разобраться, как это устроено, вам необходимо понять, как представлять биты прав доступа в восьмеричной форме (каждое значение является числом в системе счисления по основанию 8 и соответствует набору прав доступа). Дополнительную информацию об этом можно прочитать в руководстве на странице chmod(1).
Вам не обязательно знать, как составить абсолютные значения режимов, запомните те из них, которыми вы будете пользоваться чаще всего. В табл. 2.6 перечислены наиболее распространенные варианты.
Таблица 2.6. Абсолютные режимы прав доступа
Режим
Значение
Применение
644
пользователь: чтение/запись;
группа, другие: чтение
Файлы
600
пользователь: чтение/запись;
группа, другие: нет
Файлы
755
пользователь: чтение/запись/исполнение;
группа, другие: чтение/исполнение
Каталоги, команды
700
пользователь: чтение/запись/исполнение;
группа, другие: нет
Каталоги, команды
711
пользователь: чтение/запись/исполнение;
группа, другие: исполнение
Каталоги
Каталогам также можно назначить права доступа. Вы можете вывести список содержимого каталога, если он доступен для чтения, но доступ к файлу в этом каталоге можно получить лишь в том случае, если каталогу назначено право доступа на исполнение. Часто при указании прав доступа к каталогам пользователи совершают ошибку, ненароком удаляя разрешение на исполнение при применении абсолютных значений режимов.