random Улучшает качество генерации случайных чисел Да rawdevices Не вдаваясь в технические подробности, просто отключите этот сервис readahead, readahead_early Сервисы, позволяющие выполнять предварительную загрузку программ в оперативную память rhncd В дистрибутивах Red Hat и Fedora — демон, который периодически подключается к серверу Red Hat на предмет обновлений smartd Мониторинг жёстких дисков, с использованием протокола S.M.A.R.T saslauthd Обработка запросов аутентификации spamassassin Сервис, предназначенный для борьбы со спамом sshd Сервер, предназначенный для безопасного удаленного администрирования системы syslog Служба ведения системных журналов smb Если вы планируете работать в сети Microsoft, включите этот сервис, но только после его настройки, описанной в административном разделе. А пока отключите Да winbind Используется для аутентификации Samba-пользователей в домене NT xfs Сервер шрифтов, нужен для системы X Window Да named Сервер DNS ypbind Служба, используемая для обеспечения доступа к NIS-серверу yum Сервис, осуществляющий обновление системы в автоматическом режиме Узнать, какие сервисы установлены у вас в системе, можно воспользовавшись системной утилитой system-config-services (пункт меню Системные параметры→Настройка сервера→Службы) — это в Fedora Core. Кроме того, можно воспользоваться консольной утилитой ntsysv.
1.10. Справочная система
«Родной» для UNIX справочной системой, аналогом Справки Windows, служат страницы интерактивного руководства (manual pages, man-страницы). Ими снабжена практически каждая программа, важный конфигурационный файл или системный вызов. Это обычные текстовые файлы, содержащие сведения о назначении, синтаксисе, опциях команды, формате файла, примеры их применения, имена и URL разработчиков. Обычный дистрибутив содержит тысячи страниц такой документации. Просматривают ее командой man. Например,
man man
— это вызов справки о самой команде man
.При установке каждого программного пакета включенные в его состав man-страницы копируются в стандартные каталоги, так что программа man легко их находит. В этих каталогах страницы сгруппированы в секции по темам. Перечислим эти секции в порядке просмотра программой man:
1 Команды пользователя
8 Системные команды
2 Системные вызовы
3 Библиотечные вызовы (подпрограммы)
4 Устройства
5 Форматы файлов
6 Игры
7 Разное
9 Ядро (kernel internals)
Так что, если вас интересует справка не о консольной команде
exit
, а о системном вызове exit(), запрашивайте ее командой man 2 exit
.Чтобы ознакомиться с содержанием раздела, введите команду
man <номер_раздела> intro
Вот несколько самых употребительных команд управления выводом man-справки на экран:
<Ввод> вывод следующей строки текста
<Пробел> вывод следующего экрана текста
выход из программы
>образец<Ввод> поиск образца
повторение поиска.
Альтернативой команде man служит гипертекстовая справочная система info. Ссылки обозначены звездочками (*), и перемещает по ним клавиша . Чтобы пройти по ссылке, нажмите <Ввод>. Чтобы перейти на следующую или предыдущую страницу, нажмите или соответственно. Чтобы попасть на один уровень иерархии страниц вверх, нажмите . И клавиша завершает работу с программой info.
Сверхкраткую (одна строка) справку о командах дает команда
whatis <ключевое_слово>
Для работы ей нужна база данных о системных командах, создаваемая программой makewhatis.
Если точного имени команды вы не знаете, но примерно догадываетесь, какие фрагменты слов могут встретиться в ее имени или кратком описании, вам поможет команда apropos, производящая поиск в той же базе по фрагментам слов. Например, отдав команду
$ apropos config
вы получите список команд, имеющих отношение к конфигурированию системы и различных служб.
Команда man с ключом -k тоже умеет выполнять поиск по ключевым словам. Если вы хотите узнать, какие программы имеют отношение к некоторому системному файлу (конфигурационному или журнальному, например,
/etc/passwd
), введите команду$ man -k passwd
Вы получите список man-страниц по командам, функциям, формата файлов и т.п., на которых встречается слово «passwd». В общем, поиск информации в справочной системе UNIX очень похож на поиск в Интернете: находите что-то похожее и переходите по ссылкам все ближе к истине.
Есть и команда help: она выводит справку о встроенных командах командной оболочки (о командных оболочках сказано в гл.3).
Наконец, правильно написанные команды понимают ключи --help и --usage, с которыми выдают краткую справку о себе.
К сожалению, многие страницы документации на русский язык пока не переведены. Linux — ОС некоммерческая, и переводом занимаются добровольцы на общественных началах. Может быть, со временем к ним присоединитесь и вы? А пока загляните на
http://www.linuxshare.ru/projеcts/trans/index.html
Глава 2Файловая система LINUX
2.1. Видимая сторона файловой системы
С точки зрения пользователя, файловая система — это логическая структура каталогов и файлов. В отличие от Windows, где каждый логический диск хранит отдельное дерево каталогов, во всех UNIX-подобных системах эта древовидная структура растет из одного корня: она начинается с корневого каталога, родительского по отношению ко всем остальным, а физические файловые системы разного типа, находящиеся на разных разделах и даже на удаленных машинах, представляются как ветви этого дерева.
2.1.1. Имена файлов и каталогов
Имена файлов и каталогов могут иметь длину до 255 символов. Символы «/» (слэш) и символ с кодом 0 запрещены. Кроме того, ряд символов имеет специальное значение для командного интерпретатора, и их использование не рекомендуется. Это символы:
~ ! @ # $ & % * ( ) [] {} ' " \ : ; >< ` пробел
Если вам все-таки нужно употребить один их этих символов в имени файла, то при указании его имени в команде этот символ нужно экранировать знаком «\» (обратный слэш) или заключать все имя в двойные кавычки. Например, вы хотите вывести на экран командой
cat
содержимое текстового файла с именем my file
, содержащим символ пробела:$ cat my file # неправильно
cat: my: No such file or directory
cat: file: No such file or directory
$cat "my file" # правильно
Привет!
$cat my\ file # правильно
Привет!
Знак # — это символ комментария для командного интерпретатора bash, о котором подробнее рассказано в главе 8. Командный интерпретатор игнорирует все символы от этого знака до конца введенной строки. Возможность комментировать не слишком полезна при вводе команд с консоли, но неоценима при написании командных сценариев, о которых мы еще будем говорить.
Заметьте, что точки среди специальных символов нет, и имена вроде
this.is.а.text.file.containing.the.famous.string.hello.world
допустимы и широко распространены. Часто последняя отделенная точкой часть имени используется подобно «расширению имени» в Windows, обозначая файл определенного типа, но это обозначение несет смысл только для человека. Так, человеку имя файла ivan_home.tar.gz
подсказывает, что это домашний каталог пользователя ivan, упакованный архиватором tar и сжатый компрессором gzip.Если имя файла начинается с точки, то этот файл считается скрытым: некоторые команды его «не видят». Например, введя в своем домашнем каталоге команду просмотра содержимого каталога ls с ключом
-а
, означающим «показывать скрытые файлы», вы увидите больше файлов, чем введя ту же команду без ключей.Linux различает регистр символов в именах файлов: так, в одном каталоге могут находиться два разных файла
README
и Readme
. Кстати, файлы с подобными именами обычно содержат информацию, действительно достойную прочтения.Имена каталогов строятся по точно тем же правилам, что и имена файлов.
Полным именем файла (или путем к файлу) называется список вложенных друг в друга каталогов, заканчивающийся собственно именем файла. Начинаться он может с любого каталога, потому что в древовидной структуре между любыми двумя узлами существует путь. Если этот список начинается с корневого каталога, то путь называется абсолютным. Если с любого другого — то относительным (по отношению к этому каталогу).
Корневой каталог обозначается символом «/» (слэш), и этим же символом разделяются имена каталогов в списке. Таким образом, абсолютным именем файла
README
в домашнем каталоге пользователя den будет /home/den/README
.В каждом каталоге существуют два особых «подкаталога» с именами «две точки» и «точка». Первый из них служит указанием на однозначно определенный родительский каталог, а второй — на сам данный каталог. Для корневого каталога, у которого нет родителя, оба эти «подкаталога» указывают на корневой каталог. С помощью этих имен образуются относительные имена файлов. Так, именем вышеупомянутого файла
README
относительно домашнего каталога /home/ivan
пользователя ivan
будет ../den/README
.2.1.2. Назначение основных системных каталогов
В системных каталогах находятся файлы, необходимые для управления и сопровождения системы, а также стандартные программы. Их имена, расположение и содержание почти одинаковы почти во всех ОС Linux, поэтому эти каталоги называют также стандартными. Впрочем, на данный момент эпитет «стандартные» отражает скорее благие пожелания, чем действительность: иерархия каталогов одинакова только для дистрибутивов, связанных единством происхождения, а исторически сложившиеся различия создают опасность несовместимости разных дистрибутивов. Стандарт файловой иерархии для UNIX-подобных систем разрабатывает группа добровольцев, и с его текущей версией можно ознакомиться по адресу
http://www.pathname.com/fhs
.Краткое описание основных каталогов линии Red Hat и Fedora Core сведено в табл. 2.1.
Стандартные каталоги Таблица 2.1
Каталог Назначение /bin Основные программы, необходимые для работы в системе: командные оболочки, файловые утилиты и т.п. /sbin Команды для системного администрирования, а также программы, выполняемые в ходе загрузки /boot Файлы, необходимые для загрузки системы (образ ядра) /home Домашние каталоги пользователей, кроме root /dev Файлы устройств /etc Файлы настроек: стартовые сценарии, конфигурационные файлы графической системы и различных приложений /lib Системные библиотеки, необходимые для основных программ, и модули ядра /lost+found Восстановленные после аварийного размонтирования части файловой системы /media Сюда обычно монтируются съёмные носители: компакт-диски, flash-накопители /mnt Временные точки монтирования жестких дисков Использовать этот каталог необязательно: подмонтировать файловую систему можно к любому другому каталогу /opt Дополнительные пакеты программ. Если программа, установленная сюда, больше не нужна, то достаточно удалить ее каталог без обычной процедуры деинсталляции /proc Виртуальная файловая система, дающая доступ к информации ядра (например, выведите на экран файл /proc/cpuinfo). Другие файлы в этом каталоге в каждый момент времени содержат информацию о выполняющихся в этот момент программах /root Домашний каталог суперпользователя. Домашние каталоги всех остальных могут находиться на отдельном разделе, но /root должен быть в корневой файловой системе, чтобы администратор всегда мог войти в систему для ремонтных работ /tmp Временные файлы /var Часто меняющиеся данные: системные журналы и протоколы приложений, замки. Почтовые ящики, очереди печати и т.п. /usr Практически все остальное: программы, исходные коды, документация. Сюда по умолчанию устанавливаются новые программы
Скорее всего, в ваш дистрибутив включена man-страница
hier
, подробно описывающая назначение этих каталогов и их основных подкаталогов.2.1.3. Типы файлов
С точки зрения UNIX-подобных ОС, файл представляет собой поток или последовательность байтов. Такой подход позволяет распространить понятие файла на множество ресурсов не только локального компьютера, но и удаленного, связанного с локальным сетью любого рода. Доступ к любому такому ресурсу осуществляется через универсальный интерфейс, благодаря чему запись данных в файл, отправка их на физическое устройство или обмен ими с другой работающей программой происходит аналогично. Это очень упрощает организацию данных и обмен ими.
В ОС Linux можно выделить следующие типы файлов:
♦ обычные файлы — последовательность байтов (текстовые документы, исполняемые программы, библиотеки и т.п.);
♦ каталоги — именованные наборы ссылок на другие файлы;
♦ файлы физических устройств, подразделяющихся на:
• файлы блочных устройств, драйверы которых буферизуют ввод-вывод с помощью ядра и
• файлы байт-ориентированных, или символьных, устройств, позволяющих связанным с ними драйверам выполнять буферизацию собственными средствами;
♦ символические ссылки (symlink, symbolic link);
♦ именованные каналы (named pipes);
♦ гнезда (sockets).
Обычные файлы и каталогиСвойства (атрибуты) файлов и каталогов можно вывести на терминал с помощью команды ls с ключом
-l
:$ls -l /home/den/README
-rwxr-xr-- 1 den users 0 Feb 14 19:08 /home/den/README
Что это за свойства?
Первый символ выведенной строки, в данном случае дефис, обозначает тип файла. Другие значения этого свойства: d — каталог, b — блочное устройство, с — символьное устройство, l — символическая ссылка, p — именованный канал и s — гнездо.
Следующие 9 символов означают права доступа к файлу. Они делятся на три тройки, обозначающие права: владельца, членов его группы и всех остальных. Внутри каждой тройки может присутствовать или отсутствовать: право чтения (r), записи (w) и исполнения (x, от execute). Отсутствие права обозначается символом дефиса. С файлом README из нашего примера владелец (в общем случае, пользователь, создавший его) имеет право делать все, что угодно; члены его группы — только читать и запускать файл на выполнение; все остальные — только читать.
О следующем свойстве, количестве ссылок на файл, будет сказано в параграфе о символических ссылках.
Далее указаны имя владельца файла и имя его группы; размер файла в байтах; дата и время последней модификации и имя файла.
Для каталога вывод команды ls выглядит так же, но значение некоторых свойств отличается.
$ls -l -a /home/den
drwx------ 3 den users 4096 Feb 14 19:02 .
drwxr-xr-x 4 root root 4096 Feb 02 11:32 ..
[...]
Ключ -а нужен, чтобы увидеть псевдоподкаталоги «.» и «..» (их имена начинаются с точки, поэтому эти файлы скрыты).
Бит чтения в правах доступа означает право просматривать содержание каталога, записи — право создавать и удалять файлы в каталоге, исполнения — право переходить в этот каталог (делать его своим текущим каталогом).
Файлы физических устройствВсе подключенные к компьютеру устройства понимаются операционной системой как файлы: вывод информации на терминал, печать на принтере, отправка почты — все это, с точки зрения ОС, есть запись в файл. Технически файл устройства — это коммуникационный интерфейс драйвера, ведающего взаимодействием с этим устройством. Большинство таких файлов располагается в каталоге
/dev
.Загляните в этот каталог, введя команду
ls -l /dev
. Вывод этой команды займет несколько экранов, что создает повод для знакомства с командой-фильтром more, выводящей поступающие к ней на вход данные по одному экрану за раз:$ ls -l /dev | more
Чтобы увидеть следующий экран, нажмите пробел; чтобы прервать работу команды — Ctrl+С. О символе вертикальной черты, разделяющей команды ls и more, подробнее сказано в п. 3.3.1.
Об именах устройств, соответствующих разделам жесткого диска, сказано в главе 1. В следующей таблице приведена краткая справка по именам других часто используемых устройств. Символ N означает номер устройства в группе однотипных с ним устройств.
Наиболее часто используемые стандартные имена устройств Таблица 2.2
Файл Устройство null Пустое устройство. Все данные, выводимые в него, просто исчезают. Удобно использовать его для вывода ненужных сообщений console Системная консоль, т.е. физически подключенные клавиатура и монитор ttyN Пользовательская (виртуальная) консоль. Linux поддерживает до 6 таких консолей, для переключения между которыми служит комбинация клавиш Alt+Fn, где n — число от 1 до 6 pts/N Виртуальный терминал. Программа графического режима, в окне которой можно работать как в консоли mouseN Мышь audioN Звуковая карта ttySN Последовательный порт. Файл /dev/ttyS0 соответствует порту COM1 в MS-DOS. /dev/ttyS1 — порту COM2 lpN Параллельный порт cuaN Специальное устройство для работы с модемом ethN Сетевая плата fdN Дисковод для гибких дисков. Первому, то есть А:, соответствует /dev/fd0, для В: используется имя /dev/fd1 hdxN Жесткий диск с интерфейсом IDE, где x — буква, обозначающая номер такого диска (начиная с а), N — номер раздела на диске sdxN Жесткий диск с интерфейсом SCSI
Вместо размера файла команда ls выдает два числа. Это так называемые старший и младший номера устройства. Старший номер несет информацию о драйвере, к которому относится данный файл, а младший номер указывает, к какому именно из однотипных устройств следует обращаться.
Жесткие и символические ссылкиЖесткая ссылка является просто другим именем для исходного файла. После создания такой ссылки ее невозможно отличить от исходного имени файла. «Настоящего» имени у файла нет, точнее, все такие имена будут настоящими. Команда ls показывает количество именно таких жестких ссылок. Удаление файла по любому из его имен уменьшает на единицу количество ссылок, и окончательно файл будет удален только тогда, когда это количество станет равным нулю. Поэтому удобно использовать жесткие ссылки для того, чтобы предотвратить случайное удаление важного файла.
Создадим жесткую ссылку на файл README и посмотрим, что изменилось в его свойствах:
$ln /home/den/README /home/den/readme_too
$ls -l /home/den/README
-rwxr-xr-- 2 den users 0 Feb 14 19:08 /home/den/README
Жесткую ссылку можно создавать в любом каталоге, но обязательно на том же физическом носителе (то есть в той же файловой системе), что и исходный файл. О причине этого будет сказано в п. 2.2.1.
Другой тип ссылок представляют собой символические ссылки. По назначению они аналогичны ярлыкам в ОС Windows: указывают на файл, расположенный где угодно (например, на съемном носителе), и после удаления такого файла или размонтирования съемного носителя становятся бесполезны.
Символическая ссылка создается той же командой ln с ключом -s:
$ln -s /home/den/README /home/den/do.not.readme
$ls -l /home/den/do.not.readme
lrwxrwxrwx 1 den users 16 Feb 14 19:17 /home/den/do.not.readme -> /home/den/README
В поле имени файла после стрелки указано его настоящее имя. Права доступа у всех символических ссылок одинаковы и не значат ничего: возможность доступа к файлу определяется правами исходного файла. Заметьте, что в отличие от файла-оригинала файл-ссылка имеет ненулевую длину: в нем хранится абсолютное имя исходного файла. Попытайтесь вывести файл-ссылку на экран с помощью команды
cat
, и вы увидите содержание исходного, пустого, файла:$ cat /home/den/do.not.readme
$
Значение самой ссылки, то есть имя файла, на который она ссылается, можно узнать с помощью команды readlink.
Символические ссылки на каталог создаются и выглядят точно так же, как символические ссылки на обычный файл. Можно создать и цепочку ссылок на ссылки: ядро ОС проследует по всей цепочке и в итоге подставит вместо ссылки имя исходного файла.
Можно даже закольцевать такую цепочку:
$ touch a1
$ ln -s a1 a2; rm a1
$ ln -s a2 a1
$ ls -l a? # это шаблон имени. Ему соответствуют все имена из двух букв, первая «а»
a1 -> a2
a2 -> a1
$ cat a1
cat: a1: Too many levels of symbolic links
Практический смысл этого упражнения — убедить вас в том, что Linux корректно справляется с разрешением ссылок даже в намеренно некорректной ситуации.
Символическая ссылка на каталог может участвовать в образовании полного имени файла, но есть одна тонкость: по ссылке нельзя проследовать обратно в направлении корня дерева каталогов. Вместо псевдоподкаталога «..» подставляется родительский каталог каталога-оригинала. Так, если в домашнем каталоге пользователя ivan есть ссылка на домашний каталог пользователя den, то путь /home/ivan/link_to_den_home/.. эквивалентен не /home/ivan, a /home/den/.., то есть /home.
Именованные каналыЭтот тип файла еще называется буфером FIFO (First In — First Out). Через файлы такого типа два независимых процесса (две работающих программы) могут обмениваться данными: все, что записано в файл одним процессом, может быть прочитано оттуда другим. Именованный канал создается командой mkfifo.
ГнездаМеханизм гнезд (сокетов, sockets) впервые появился в версии 4.3 BSD UNIX (ветвь UNIX, начавшая развиваться в калифорнийском университете Беркли). Позже он превратился в одну из самых популярных систем сетевого обмена сообщениями, реализованную во многих, не только UNIX-подобных, операционных системах. В честь создателей этот механизм до сих пор называют Berkeley Sockets.
Собственно гнездо — это абстрактная конечная точка сетевого соединения. Процесс отправляет данные в сеть, записывая их в файл гнезда. При этом процессы, установившие связь через пару гнезд, могут быть запущены как на разных компьютерах, так и на одном.
Межпроцессный обмен через гнезда используется такими стандартными компонентами Linux, как служба учета syslog и оконная система X Window.
2.1.4. Команды работы с файлами и каталогами
Предварительно замечу, что командой в ОС Linux называется все, что может быть выполнено: исполняемый файл, встроенная команда текущей программы и даже формируемая на ходу последовательность символов. Синтаксис обычной команды:
имя_команды [короткие_ключи] [длинные_ключи] [аргументы]
где в квадратные скобки взяты необязательные данные. Ключи можно указывать в любом порядке, разделяя их пробелами. Аргументы тоже отделяются друг от друга пробелами.
Имена коротких ключей, или опций, состоят из одной буквы, перед которой стоит символ «-» (дефис). У ключа может быть свой аргумент. Короткие ключи, у которых нет аргументов, можно соединять под одним дефисом: так, команда
ls -l -a -d
эквивалентна команде ls -lad
.Имена длинных ключей — это осмысленные слова, перед которыми стоят два символа «-» (дефис). Большинство команд понимают ключи --help и --usage, требующие вывести краткую справку об использовании команды. Необязательный ключ «--» сигнализирует об окончании списка ключей и начале аргументов.
Справку о ключах и аргументах команды можно получить по команде man.
Текущий каталогТекущий каталог — это каталог, от которого отсчитываются относительные пути. В каждый момент времени с каждой работающей программой, в том числе с командной оболочкой, связан единственный такой каталог. Узнать, какой каталог сейчас является текущим, можно с помощью команды
pwd
без аргументов.Сменить текущий каталог можно командой
cd [новый_каталог]
Для смены текущего каталога на домашний каталог пользователя можно вместо имени нового каталога указать специальный символ
~
: cd ~
.Разрешается переходить также в псевдоподкаталоги «.» и «..». В первом случае ничего не изменится, а во втором текущим каталогом станет родительский.Просмотр содержимого каталогаУже знакомая команда
ls [имя_каталога]
выводит его содержимое на экран. Если не указывать имя каталога, команда выведет содержание текущего каталога.Вместо имени каталога можно указать шаблон имен файлов: например,
ls my*
покажет все файлы и подкаталоги, имена которых начинаются с «my».Подробнее об аргументах и ключах команды ls (как, впрочем, и любой другой команды) можно узнать у справочной системы, набрав команду
man ls
.Создание и удаление файлаСоздать пустой файл можно командой
touch <имя_файла>
Вообще-то она предназначена для того, чтобы для всех заинтересованных программ (например, утилиты сборки проекта make) файл выглядел новее, чем на самом деле: она меняет время последнего изменения файла на текущее время. Но если файла с таким именем не существует, то она его создаст.
Текстовые файлы можно создавать, вводя текст с консоли:
$ cat > hello.world
Привет!
Оказывается, команду cat можно заставить не только выводить файл на консоль, но и вводить с нее. Это достигается перенаправлением ввода-вывода, о котором подробнее будет сказано в главе 8. В таком режиме команда cat считает своими входными данными поток байтов, поступающий с клавиатуры, и выводит его в указанный файл. Иными словами, в файл записывается все, что вы после этой команды введете с клавиатуры. Чтобы закончить ввод, нажмите Ctrl+D.
Если файл с указанным именем существует, то команда
cat
перепишет его. Чтобы вместо этого добавить данные в конец файла, перенаправьте ее вывод с помощью символов >>
:$ cat >> hello.world
Каталог создается командой
mkdir <имя_каталога>
Чтобы операция создания файла или подкаталога прошла успешно, вы должны иметь право записи в каталог, в котором вы его создаете.
Удалить пустой каталог можно командой
rmdir <имя_каталога>
Удаляется файл командой
rm <имя_файла>
При этом наличие прав на запись и даже чтение этого файла не требуется: достаточно иметь право на запись в каталог, где находится этот файл. Ключи команды rm:
♦-i: требует подтверждения удаления для каждого удаляемого файла. Если вы заказали удаление группы файлов (например, по шаблону имени
rm chernovik*
), то среди них может оказаться файл, который вам еще нужен: безопаснее применить ключ -i. Подтвердите удаление каждого файла или откажитесь от него, введя символ Y или N соответственно;♦-f: не запрашивать подтверждения, не выводить сообщений об ошибках. Если указаны оба ключа -i и -f, то срабатывает последний указанный;
♦-r: рекурсивное удаление каталога со всеми его подкаталогами. Непустой каталог можно удалить только так.
Копирование и перемещение файлаФайл копируется командой cp. Формат этой команды:
cp [ключи] <исходный_файл> {<файл_назначения> | <каталог_назначения>}
Полезные ключи команды cp:
♦-i: требовать подтверждения перед перезаписью существующего файла;
♦-f: не требовать подтверждения;
♦-r: рекурсивно копировать каталог со всеми подкаталогами;
♦-а: сохранять атрибуты файла;
♦-d: копировать символические ссылки вместо файлов, на которые они указывают;
♦-s: создавать символические ссылки вместо копирования (-l — жесткие);
♦-u: не переписывать существующий файл, если он модифицирован позже;
♦-х: игнорировать подкаталоги, расположенные в других файловых системах.
Кстати, команда cat с перенаправленным выводом тоже может скопировать файл:
$ cat hello.world > copy.of.hello.world
Команда mv перемещает или переименовывает файлы. Формат команды:
mv [ключи] <исходный_файл> {<файл_назначения> | <каталог_назначения>}
Ключи -i, -f имеют тот же смысл, что для команд cp и rm.
Просмотр текстовых файловПеред тем, как просматривать файл, неплохо было бы убедиться, что он действительно является текстовым, то есть содержит только печатные ASCII-символы. Для проверки типа файла служит команда
file <имя_файла>
Если ее ответ содержит слово «text», то файл можно безопасно вывести на терминал. Вывод двоичного файла может сбить кодировку так, что вместо набираемых на клавиатуре символов вы увидите черт знает что. Если это все же случилось, введите вслепую команду
$ tput reset
(или, если вы работаете в графическом режиме в окне виртуального терминала, выберите в его меню команду Терминал|Сброс и очистка для среды GNOME или Edit|Reset & Clear Terminal для среды KDE).
Кроме уже упомянутой команды cat, для вывода файла на терминал служат команда
more <имя_файла>
и ее улучшенный вариант less.
Команда-фильтр more разбивает поток своего вывода на порции размером в экран и ожидает ввода пользователя для отображения следующей порции. Чтобы увидеть следующую строку, нажмите <Ввод>; чтобы увидеть следующий экран, нажмите <пробел>; чтобы прервать работу команды, нажмите или Ctrl+C.
Утилита less позволяет листать выводимый файл не только вперед, но и назад (клавишами PgDn и PgUp), перемещаться к указанному месту в файле, искать по образцу и дает еще много полезных возможностей. В общем, man less.
Если интересующая вас информация находится в конце файла (например, вы хотите просмотреть журнал системных сообщений
messages
в каталоге /var/log
, чтобы узнать, что именно только что пошло наперекосяк), то вам поможет командаtail [-N] [имя_файла]
где N — число выводимых строк файла, считая от последней. Командой
head [-N] [имя_файла]
можно просмотреть, наоборот, только первые N его строк. Значение N по умолчанию равно 10.
Если вы хотите просмотреть не весь файл, а только те его строки, которые содержат заданный фрагмент текста, используйте команду-фильтр grep. Например, я хочу сменить клавишу переключения раскладки клавиатуры в графическом режиме. Я знаю, что строки конфигурационного файла
/etc/X11/xorg.conf
, имеющие отношение к клавиатуре, содержат фрагмент XKB… а может, Xkb или xkb? Неважно:$ grep -in xkb /etc/X11/xorg.conf
[...]
65: Option "XkbLayout" "us,ru"
66: Option "XkbOptions" "grp:shift_toggle,grp_led:scroll"
Я указал ключи: -i, требующий игнорировать различия регистра в образце для поиска и файле, и -n, требующий выводить номера строк, в которых встречается образен xkb.
Для всех команд ключи без аргументов можно соединять: запись -in эквивалентна записи -i -n.
Редактирование текстовых файловВышеприведенный пример показывает, что переключением раскладки клавиатуры в графическом режиме управляет комбинация клавиш Shift + Shift. Неудобно: в консольном режиме я привык к Ctrl+Shift. Надо заменить значение shift_toggle на ctrl_shift_toggle. Такие мелкие правки конфигурационных файлов — обычное дело для администратора, поэтому средство их внесения присутствовало в UNIX-системах всегда. Это консольный редактор vi, входящий в каждый дистрибутив Linux (в дистрибутив Fedora Core 3 включен его улучшенный вариант vim, но команда vi тоже доступна: она стала псевдонимом для команды vim).
Итак, я делаю на всякий случай резервную копию конфигурационного файла
/etc/X11/xorg.conf
и приступаю к его редактированию:$ cp /etc/X11/xorg.conf /etc/X11/xorg.conf.sav
$ vi /etc/X11/xorg.conf
Перемещаюсь к строке 66 командой 66G (буква G заглавная: редактор vi различает регистры). Клавишами управления курсором перемещаюсь к началу слова shift.
Включаю режим вставки командой i (строчная буква). Набираю ctrl_. Выключаю режим вставки клавишей Esc. Сохраняю изменения командой :w. Выхожу по команде :q.
Сложно и на вид бессистемно? Да. Зато есть команда :help.
Как полноэкранный редактор, vi может находиться в одном из двух режимов. В режиме вставки вводимые символы поступают в редактируемый файл, в командном режиме они воспринимаются как команды. Перечислю коротко самые употребительные команды редактора vi:
РЕЖИМ ВСТАВКИ.
Включение режима вставки:
♦ i в текущей позиции курсора;
♦ I перед первым непробельным символом в текущей строке;
♦ w в новой строке, добавленной после текущей;
♦ W в новой строке, добавленной перед текущей.
Выключение режима вставки:
♦
Команды режима вставки:
♦ Ctrl+a повторить предыдущую вставку;
♦ Ctrl+у вставить символ, находящийся над курсором (в предыдущей строке);
♦ Ctrl+e вставить символ, находящийся под курсором (в следующей строке).
КОМАНДНЫЙ РЕЖИМ.
Удаление (здесь и далее N — это число):
♦ N x N символов под курсором и справа от него;
♦ N X N символов слева от курсора;
♦ N dd N строк;
♦ D до конца текущей строки;
♦ N D до конца текущей строки и еще N-1 строку.
Копирование и вставка строк:
♦ N yy взять в буфер N строк от текущей и ниже;
♦ p вставить содержимое буфера после текущей строки;
♦ P вставить содержимое буфера перед текущей строкой.
Поиск и переход:
♦ N G перейти к строке с номером N;
♦ $ G перейти к последней строке файла;
♦ /<образец> искать образец вниз от курсора;
♦ ?<образец> искать образец вверх от курсора;
♦ n повторить поиск в том же направлении;
♦ N (буквально «N»): повторить поиск в обратном направлении.
Сохранение и выход:
♦ :w сохранить текущий файл;
♦ :w <имя> сохранить под новым именем, если файл <имя> еще не существует;
♦ :w! <имя> сохранить пол новым именем, переписав существующий файл;
♦ :q выйти;
♦ :q! принудительно выйти без сохранения;
♦ :wq сохранить и выйти.
Разное полезное:
♦ N u отменить последние N изменений;
♦ N Ctrl+r вернуть последние N отмененных изменений;
♦ U отменить изменения в последней строке;
♦ N r <символ> заменить N следующих символов на <символ>;
♦ N >> добавить отступ (Tab) в N следующих строк;
♦ N << удалить один отступ (Tab) из N следующих строк;
♦ :sh временно выйти в оболочку (вернуться — exit);
♦ :!<команда> выполнить команду оболочки.
Поиск файловБыстрый поиск имени программы можно выполнить прямо из командной строки: для этого введите первые буквы нужной вам команды и нажмите . Если введенные вами буквы однозначно определяют команду или исполняемый файл, то ее имя появится в командной строке. Эта функция называется автозаполнением командной строки. Если не появилось ничего, нажмите еще раз для вывода списка всех доступных команд, начинающихся со введенных букв. Если таких команд окажется больше сотни, у вас попросят подтверждения того, что вы действительно хотите увидеть их все.
В разных каталогах может оказаться несколько исполняемых файлов с одинаковыми именами. Какой из них будет исполнен? На этот вопрос отвечает команда which. Она просматривает каталоги, перечисленные в переменной окружения PATH, в поисках исполняемого файла с указанным именем, и выводит абсолютное имя первого встреченного из них.
Команда whereis ищет не только исполняемый файл, но и его справочные страницы и исходный код.
Команда locate ищет файл по образцу имени, опираясь на свою базу данных о файловой системе. Ее вариант с повышенной безопасностью slocate сохраняет данные о правах доступа к файлам, так что пользователь не увидит тех файлов, на которые у него нет прав. В дистрибутиве Fedora Core 3 команда locate представляет собой символическую ссылку на утилиту slocate.
Команда find ищет файл по его атрибутам в указанном каталоге и его подкаталогах на заданную глубину. Например, при установке операционной системы я отказался устанавливать файловый менеджер Midnight Commander, а теперь он мне понадобился. Для каждого из 4 компакт- дисков дистрибутива запускаю команду поиска по шаблону имени «mc*», то есть всех файлов, имена которых начинаются с mc:
$find /media -name mc*
/media/cdrecorder/Fedora/RPMS/mc-4.6.1-0.8.i386.rpm
В итоге на третьем диске найден пакет RPM. Об установке программного обеспечения из пакетов RPM будет сказано в главе 7.
Изменение прав доступа к файлуКак многопользовательская операционная система, ОС Linux содержит механизм разграничения доступа к данным, позволяющий как защитить данные одного пользователя от нежелательного вмешательства других, так и разрешить другим доступ к этим данным для совместной работы.
Как уже сказано, любой ресурс компьютера под управлением ОС Linux представляется как файл, поэтому мы будем говорить только о правах доступа к файлу.
По отношению к файлу пользователь может входить в одну из трех категорий: владелец, член группы владельца, все остальные. Для каждой из этих категорий есть свой набор прав доступа.
Первым владельцем файла становится его создатель. Дальше файл можно передать другому владельцу или в другую группу командой
chown [ключи] <новый_пользователь>[:новая_группа] <файл>
или
chgrp [ключи] <новая_группа><файл>
В некоторых реализациях Linux передать файл другому владельцу имеет право только суперпользователь, а в других — также его текущий владелец.
Набор прав доступа состоит из прав на чтение, запись и исполнение файла. В символьном представлении он выглядит как строка «rwx», где вместо любого символа может стоять дефис. Буква означает наличие права (r — чтение, w — запись, x — исполнение), дефис — его отсутствие.
Очевидно, что эти три бита могут быть записаны еще и как восьмеричное число. Так, права доступа r-x (чтение и исполнение без записи) понимаются как три двоичные цифры 101 или как восьмеричная цифра 5. Численное представление прав доступа называется абсолютным, или двоичной маской.
Полная строка прав доступа в символьном представлении устроена так:
<права_владельца><права_группы><права_остальных>
В абсолютном представлении права владельца являются старшим разрядом восьмеричного числа, права группы — вторым и права остальных — третьим. Так, права rwxr-x--x выглядят как число 111 101 001, или 751.
Команда изменения прав доступа chmod понимает как абсолютное, так и символьное указание прав.
Назначим файлу
/home/den/README
права rw-r-----, то есть разрешим себе чтение и запись, группе только чтение, остальным пользователям — ничего:$cd ~ # переход в свой домашний каталог
$chmod 640 README # 110 100 000 == 640
$ls -l README
-rw-r----- 1 den users 0 Feb 14 19:08 /home/den/README
В символьном представлении можно явно указывать, кому какое право мы хотим добавить, отнять или присвоить. Добавим право на исполнение файла README группе и всем остальным:
$chmod go+x README
$ls -l README
-rw-r-x--x 1 den users 0 Feb 14 19:08 /home/den/README
Формат символьного режима:
chmod <категория><действие><набор_прав><файл>
Возможные значения аргументов команды представлены в таблице 2.3.
Аргументы команды
chmod
в символьном режиме Таблица 2.3Аргумент Значение Категория u Владелец g Группа владельца o Прочие a Все пользователи, то есть «a» эквивалентно «ugo» Действие + Добавить набор прав - Отменить набор прав = Назначить набор прав Право r Право на чтение w Право на запись x Право на исполнение s Право смены идентификатора пользователя или группы t Бит прилипчивости (sticky-бит) u Такие же права, как у владельца g Такие же права, как у группы o Такие же права, как у прочих
Название бита прилипчивости унаследовано от тех времен, когда объем оперативной памяти был маленьким, а процесс подкачки медленным. Этот бит позволял оставлять небольшие часто используемые программы в памяти для ускорения их запуска. Сейчас его значение переосмыслено: этот бит, установленный для каталога, приводит к тому, что удалять файлы из этого каталога могут только владелец файла и владелец каталога. Обычно это используется в каталогах, открытых для записи всем (например,
/tmp
).Права смены пользователя и группы (SUlD-бит и SGID-бит) означают следующее. Обычно исполняемый файл (программа или командный сценарий) получает те же права на доступ к файлам, что и пользователь, который запустил его на выполнение. Но у этого файла есть еще и владелец, полномочия которого могут быть совсем другими. Наличие одного из этих битов позволяет выполняющейся программе пользоваться полномочиями владельца программного файла или члена его группы
Так, команда su (substitute user), позволяющая «стать» другим пользователем без завершения своего сеанса и входа под новым именем (это нужно, например, чтобы быстро выполнить административную задачу от имени суперпользователя), имеет следующие атрибуты:
$ls -l `which su`
-rwsr-xr-x 1 root root [размер, дата, время] /bin/su
Биты «x» сообщают, что любой пользователь может запустить эту программу, а бит «s» — о том, что во время ее выполнения он будет пользоваться правами суперпользователя root (если, конечно, знает пароль).
Обратите внимание на применение обратных апострофов: они нужны для того, чтобы направить вывод команды which на вход команды ls.
Следует учитывать, что программы, требующие установления SUID (или SGID) для своей работы, являются потенциальными дырами в системе безопасности. Представьте такую ситуацию: у вас в системе установлена программа superformat, которая предназначена для форматирования дисков. Создание файловой системы, пусть даже на дискете, — это привилегированная операция, требующая полномочий суперпользователя.
При установке этой программы для нее сразу устанавливается право SUID, чтобы разрешить пользователям форматировать дискеты. Пользователь запускает ее для форматирования дискеты. Программа запускается, получает права root, форматирует дискету и нормально завершает работу.
А если она завершает работу аварийно, например, по ошибке переполнения стека (такие случаи отмечались)? Тогда запустивший ее пользователь получит права root! Неквалифицированный пользователь с правами root — это намного хуже, чем просто крах системы. Помните о потенциальной опасности при работе с такими программами и по возможности избегайте использования прав SUID и SGID.
Справедливости ради нужно заметить, что ряд системных программ (в частности, демон установления интернет-соединения pppd) разрабатывался с учетом прав SUID и SGID, и эти программы являются максимально защищенными, хотя полной уверенности в этом нет. Поэтому использовать право SUID нужно только в самых крайних случаях.
Я позволю себе сделать еще несколько замечаний относительно прав доступа SUID и SGID:
1. Лучше не использовать программы, требующие привилегий, на сервере, точнее, не разрешать обыкновенным пользователям их использовать. Использование права доступа SUID вы можете себе позволить только на своей домашней машине, например, для установления того же коммутируемого соединения, чтобы каждый раз при подключении к Интернету не вводить команду su.
2. Перед использованием программ, требующих привилегии root, убедитесь в их надежности. Если программа получена из ненадежного источника, лучше ее не использовать. Надежными источниками считаются сайты или FTP-серверы разработчиков дистрибутивов Linux, Желательно получить исходный код такой программы, чтобы убедиться, что она не производит каких-либо несанкционированных действий.
3. Нет ни одной причины, по какой нужно было бы разрешить использование SUlD-программ в домашних каталогах пользователей. Для разделов, в которые разрешена запись обыкновенным пользователям, установите опцию nosuid в файле
/etc/fstab
.2.2. Изнанка файловой системы