Знакомство с Linux. Часть 7. Редактируем системные файлы вручную

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


Я не говорю даже о политике или социальных явлениях. Возьмите сисадминов и юзеров... Линуксоидов и адептов *BSD... Да что далеко ходить - даже в такой, казалось бы, беспочвенной для конфликтов области, как текстовые редакторы, пользователи Linux/*NIX разделены, оказывается, на враждебные одна другой группировки - как футбольные фаны, честное слово. Понятно, что процент выраженно фанатичных экстремистов, как и в мире спортивных болельщиков, не слишком велик, но именно они задают основной тон конфликта. Хотя, казалось бы, тут-то о чём спорить? Открывай редактор и пиши.

Вот именно те люди, которым позиция "открывай и пиши" ближе, чаще всего склоняются к использованию редактора vi. Это первый по-настоящему полнофункциональный и полноэкранный текстовый редактор для UNIX, благополучно перекочевавший на Linux и имеющийся в любой инкарнации этой операционной системы. Уметь обращаться с ним необходимо, если, конечно, вы не склонны к использованию антикварных продуктов - таких, как старый добрый ed, разрабатывавшийся ещё во времена телетайпных терминалов, когда ни о каких мониторах у компьютеров и речи не было.

Другое дело - редактор emacs, созданный основателем Фонда свободного ПО (Free software foundation) и основным идеологом лицензии GNU Ричардом Столманом. Emacs - крупная, постоянно совершенствуемая система, которую горячие её сторонники называют даже интегрированной средой, а не просто каким-то там редактором. В её состав входят собственный интерпретатор языка LISP, расширения для компиляции и отладки программ, учебник (не справка по основным командам, а полноценный учебник), море документации. Версия GNU Emacs ориентирована в основном на использование в текстовом режиме, а в графической среде X Window System лучше использовать XEmacs - как правило, обе версии редактора имеются в любой уважающей себя системе.


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

Редактор vi тоже прошёл долгий исторический путь: в современных дистрибутивах Linux не часто встретишь его исконную инкарнацию - как правило, при обращении к vi вызов перенаправляется редакторам vim (Vi IMproved) или nvi. Однако все добавления и усовершенствования (сделанные, по большей части, ради удобства работы в графической оболочке) не затрагивают базовых возможностей и способов управления vi.

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



В режиме редактирования производится набор и смысловая правка текста. Модификация же текста в целом и операции с его фрагментами (абзацами, строками, словами, манипуляции с поиском и заменой и т. п.) производятся в командном режиме. Переход из исходного, командного, в режим редактирования осуществляется нажатием клавиши i, что можно интерпретировать как insert - "вставка".

Действуя в рамках стандартного vi, в режиме вставки можно вводить текст (разделяя строки нажатиями клавиши Enter), а также править своевременно замеченные опечатки, стирая символы перед курсором с использованием клавиши Backspace. Вообще говоря, современная инкарнация vi, vim, поставляемая с Red Hat Linux, позволяет уже в этом режиме применять курсорные стрелки для перемещений по тексту, однако следует помнить, что реализация vi на другой системе может и не быть настолько удобной. Будьте внимательны, используя стрелки вниз и вверх: каждое нажатие на них сдвигает курсор по вертикали не на соседнюю видимую в окошке редактора строку, а в соответствующую позицию соседней истинной строки (той, что отделена от текущей нажатием на клавишу Enter). С непривычки это может показаться неудобным - но ведь наверняка вы не станете вручную набивать в vi "Илиаду", а для нужд системного администрирования такое поведение оказывается более чем полезным.

Закончив набор текста, возвращайтесь в командный режим при помощи клавиши Escape. В каком именно режиме вы находитесь в каждый конкретный момент, поможет понять нижняя строка на экране: в командном она отображает имя файла, число строк (L) и символов (C) в нём, позицию курсора (строка и колонка истинной строки), а также долю объёма файла от его начала до текущего экрана (в процентах; если файл помещается на экране целиком, на этой позиции в правом нижнем углу размещается слово ALL). В режиме редактирования слева внизу указывается, как именно производится внесение правки в текст: вставкой нового (--INSERT--) или заменой присутствующего (--REPLACE--). В конце концов, если вы что-то забыли и запутались, полезно нажать лишний раз на Escape: в командном режиме это никакого действия не окажет, а из редактирования выведет.

Командный режим уже и в классическом vi предоставляет возможности перемещения по тексту: можно использовать курсорные стрелки или клавиши h, j, k, l (перемещения влево, вниз, вверх, вправо соответственно). Для сдвига курсора на целое слово назад используйте клавишу b, для сдвига вперёд - w. Клавиша 0 (ноль) переместит курсор к началу текущей строки, а $ (то есть одновременное нажатие Shift и 4) - к её концу. Пролистывание целых экранов вперёд осуществляется комбинацией клавиш Ctrl и f (forward), а назад - Ctrl и b (back). Заглавная G (то есть нажатие клавиш Shift и g одновременно) переместит курсор к последней странице документа. Можно комбинировать эту команду с цифрами: нажав последовательно клавиши 1, 0 и G, то есть, отдав команду "10G", вы установите курсор на десятую истинную строку текста. К началу документа, таким образом, можно перейти при помощи команды 1G.


Если требуется отыскать в тексте какой-либо фрагмент, с его поиском поможет команда /, вслед за которой надо набрать искомую комбинацию символов: отобразится она в нижней, служебной строке редактора. После нажатия на Enter курсор установится в позицию, соответствующую первому включению этого фрагмента в текст; чтобы перейти к следующему, введите / (то есть нажмите /, а потом - Enter), а к предыдущему - ? (Shift и / одновременно, а затем уже Enter). Все фрагменты при этом выделятся в тексте цветом: простой инверсией в случае классического vi, или светло-серым на оранжевом фоне для vim и стандартного цветного терминала.


Уже находясь в командном режиме, можно вносить в текст некую глобальную правку, а именно - удалять его фрагменты. Нажмите x, чтобы исчез символ, находящийся прямо в позиции курсора (текст в строке сдвинется влево). Чтобы уничтожить текущую строку, дважды нажмите клавишу d. Команда dG удалит весь текст за курсором до конца файла; команда d$ - весь текст до конца строки. Пользуйтесь этими возможностями крайне аккуратно. Команда p вернёт на место удалённый текст, но только тот, что был уничтожен прямо сейчас - многошагового буфера удаления в vi не существует.

Впрочем, некая страховка от неудачных действий у нас всё же имеется: все операции, проводимые над текстом в vi, воздействуют не на сам файл, а на его рабочую копию (так называемый буфер редактирования). И если не подтвердить специальной командой запись этих изменений, файл останется нетронутым. Для этих и некоторых других операций в vi имеется третий режим работы: ex (и-экс). Для перехода в него нажмите в командном режиме (именно в командном) : (двоеточие), то есть Shift и клавишу ; одновременно.

О переходе в режим ex свидетельствует очистившаяся служебная строка в самом низу экрана, в начале которой появляется двоеточие - приглашение ко вводу ex-команд. Две основные, без которых нам никак не обойтись, это q (выход) и w (запись буфера редактирования, окончательное внесение правки в исходный файл). Напечатав команду в служебной строке, нажмите Enter, и она исполнится. Маленькое замечание: выйти из vi, если в буфер редактирования были внесены изменения, которые потом не подтвердились записью, просто так не получится. Если вы сделали с текстом явно что-то не то, и проще начать заново, чем переправлять собственную правку, используйте команду q! (перейти в режим ex, напечатать в служебной строке q и !, нажать Enter). Если же придирчивый взгляд не выявил в исправленном тексте никаких несообразностей, смело используйте комбинацию wq - запись буфера в файл с последующим выходом из редактора. Кстати, аналогом wq в ex-режиме служит команда ZZ в командном (двойное нажатие на клавишу z при удерживаемом Shift'е).

Конечно, у vi есть масса других полезных возможностей, но на первое время вполне достанет и этих. Помните, в прошлый раз мы сетовали на то, что файл /etc/fstab был создан системой при установке, и неудачное расположение точки монтирования Windows-разделов (в корневом каталоге, а не в /mnt) пришлось изменять вручную? Так вот, настала пора расставить всё по местам.

Войдите в систему суперпользователем: вы окажетесь в /root, суперпользовательской домашней директории (можно убедиться в этом при помощи команды pwd). Прежде чем приступать к работе с каким-либо системным файлом, полезно - не полагаясь только на встроенные в редактор средства защиты от необдуманных изменений - скопировать этот файл в известное место, чтобы точно знать в случае чего, где находится его априори рабочий вариант. Давайте создадим каталог с прозрачным наименованием etc-backups и спасём туда текущую версию /etc/fstab, прибавив к названию файла ещё и дату - чтобы проще было ориентироваться при надобности.


Директории /mnt/c и /mnt/d уже были созданы нами в прошлый раз, то есть правильные точки монтирования уже есть. Какие параметры указывать, чтобы русские наименования файлов/директорий отображались корректно в и в Linux, мы теперь тоже знаем. Остаётся всё это внести в файл. Ну что же, бесстрашно наберём vi /etc/fstab и примемся за дело. Вместо /dos-c и /dos-d во второй колонке (для /dev/hde1 и /dev/hde5 соответственно) укажем /mnt/c и /mnt/d; вместо defaults в четвёртой пропишем параметры iocharset и codepage... А также по три дополнительных: uid, gid и umask.

Ну, с umask всё ясно: маска 007 означает, что монтироваться эти разделы будут с полными правами для владельца и группы, а все остальные - то есть все, кто не входят в указанную группу - доступа к ним иметь не будут даже на чтение. С точки зрения безопасности - полезно. В системе заведётся (совсем скоро!) особый пользователь, от имени которого и будут монтироваться разделы Windows. И если, паче чаяния, каким-нибудь невероятным образом на одном из них окажется написанный для Linux вредоносный код (вирусы и под Linux бывают, а вы как думали?), то скорее всего, он не сможет нанести системе вообще никакого вреда. Если грамотно ограничить права Windows-пользователя, конечно. В таком случае, очевидно, uid и gid задают идентификаторы этого самого пользователя и его группы. Но почему именно такие и откуда они взялись?

Вообще говоря, хорошо, что внесённые в /etc/fstab изменения автоматически не вступают в силу. А то могло бы оказаться, что у вас в системе уже есть пользователь и группа с идентификаторами 502... Давайте это проверим, и если нет, то заведём их. Выходите из редактора с сохранением (ZZ в командном или wq в ex-режиме) и посмотрите на самый хвостик своего файла /etc/passwd. Какой идентификатор присвоен последнему зарегистрированному в системе пользователю?


В моём случае это - 501 для пользователя dummy; значит, 502-й пока свободен. По умолчанию, первой учётной записи пользователя (не root'а!) присваивается номер 500, второй - 501 и так далее. С этим номером связывается имя пользователя, отображаемое, скажем, командой ls с параметром -l, однако реально принадлежность файла пользователю и группе характеризует именно номер.


Именные идентификаторы групп пользователей система берёт из файла /etc/group. Подробную информацию о том, как оба этих файла устроены, можно почерпнуть из соответствующих руководств (команды man 5 passwd и man 5 group). Более того, в системе имеются стандартные средства для создания новых учётных записей пользователей и групп - утилиты useradd и groupadd (см. их страницы руководств). Однако перед нами не стоит сейчас задача завести полноценного пользователя: напротив, нужно создать учётную запись с весьма ограниченными правами. А для этого вполне достаточно будет подредактировать системные файлы вручную. Заодно и в применении vi попрактикуемся.


Прежде всего, создайте, как и для /etc/fstab, резервные копии /etc/passwd и /etc/qroup. Открываем в vi /etc/passwd, переходим к концу файла (G - помните?) - и видим, что курсор установился в первую позицию последней строки. Если нажать сейчас клавишу i, именно с этой позиции и начнётся правка. Но нам ни к чему корёжить существующую строчку, надо начать новую. Перейти в режим вставки начиная со строки ПОД текущей позволит нам команда o. Нажмём эту клавишу и приступим.


Так; первым в строке, соответствующей каждой учётной записи, стоит имя пользователя. Те, что составляют большую часть файла - с идентификаторами меньше сотни - это служебные эккаунты (или аккаунты? О, великий и могучий...); с пятисот начинается именование пользователей настоящих. Хорошо; раз опция загрузки Windows-системы обозначается загрузчиком GRUB как DOS, пусть и владеющий подмонтированными разделами Windows пользователь называется doser. Запишем его имя с новой строки.

Поставим вслед за тем двоеточие: это разделитель полей в файле /etc/passwd. В следующем поле у каждой из записей наличествует крестик (буква х) - как обозначение того факта, что в файле /etc/shadow хранится настоящий пароль данного пользователя, доступ к просмотру которого имеет только root, тогда как /etc/passwd открыт для чтения всем и каждому (команда ls, например, устанавливает соответствие между именем учётной записи и идентификационным номером именно в соответствии с ним). Поставим в этом поле иксик и мы; двинемся затем дальше. Два последующих поля (не забывайте разделять их двоеточиями!) - идентификаторы пользователя и группы; поставим те же, что уже применили в /etc/fstab для Windows-разделов, - 502. Затем идёт поле описания: как правило, в нём размещается полное имя пользователя или некое пояснение для служебного эккаунта. Содержание - произвольное (осторожнее с двоеточиями!). Следующее поле - домашний каталог для данной учётной записи. Данной записи домашний каталог не потребуется: под именем doser никто не будет входить в систему. Поэтому укажем в качестве каталога традиционную "чёрную дыру", устройство /dev/null, официально называемую в руководстве "мусорной корзиной для данных": документ, записываемый в этот файл, исчезает. И наконец, последний штрих: командный интерпретатор пользователя. Та среда, в которой выполняются все прочие команды. По умолчанию в Red Hat Linux это /bin/bash, но мы даже консоли пользователю doser не доверим, и потому укажем вместо интерпретатора очередную затычку - программу /sbin/nologin, которая вежливо сообщает пытающемуся войти в систему пользователю с соответствующим именем, что логин невозможен. Впрочем, степень вежливости тут настраиваемая; за подробностями обращайтесь к man nologin.


Всё! Переходим в ex-режим (Escape, чтобы вернуться в командный, и затем двоеточие); ещё раз убеждаемся, что все поля заполнены верно, и набрав комбинацию wq, нажимаем Enter - выходим из редактора, сохранив файл.

Теперь - самое время внести правку в /etc/shadow, чтобы уж точно убедиться, что ни под каким паролем входа doser'у в систему не будет. Снова перемещаемся в конец файла, входим в режим редактирования... Посмотрите: у учётной записи, предназначенной для пользовательского входа в систему, здесь находится зашифрованный пароль. У всех остальных в соответствующем поле - по два восклицательных знака. Так сделаем и для doser'a. Пусть вас не смущает множество очевидно пустых полей: там хранится информация о сроках истечения действия паролей, и в системах с большим количеством пользователей поля эти работают вовсю. Мы сейчас можем даже не разбираться, каков смысл каждого из них, а просто скопировать их у любого другого (кроме "полноценного"!) пользователя. Страница руководства man 5 shadow поможет заинтересовавшимся вникнуть в вопрос глубже; скажу только, что формат дат в этом файле очень интересен и крайне показателен для Linux/*NIX. Эти целые числа обозначают дни, прошедшие до указанной даты с 1 января 1970 года. Кстати, файл /etc/passwd мало того что скрыт от непривилегированных взоров, - он ещё и для root'а снабжён опцией "только для чтения". Когда вы решитесь сохранять изменения в нём, система напомнит вам об этом и попросит подтвердить запись, напечатав в ex-режиме не w, а w!.


А теперь давайте и с группой разберёмся, наконец. Уже привычным нам способом создаём резервную копию /etc/group, открываем его в vi и в конце, с новой строки, записываем имя вновь создаваемой группы - dosers. Логично, верно? Ставим двоеточие-разделитель, иксик на месте пароля (да, и использование группы, а не только учётной записи, можно защищать паролем, - но нам на уровне домашнего ПК это ни к чему), снова двоеточие, номер группы (тот же, что фигурировал в gid, указанном нами в обновлённом /etc/fstab) и затем - список её членов через запятую. Всё достаточно логично.


Вот, собственно, и всё с корректным монтированием Windows-разделов. Остаётся пара финальных штрихов.

Отмонтируем от нынешних точек диски C и D, после чего уничтожим за ненадобностью сами точки - директории /dos-c и /dos-d в корневом каталоге. Для этой цели существует команда rmdir, удаляющая ТОЛЬКО пустые каталоги. Пользоваться ей спокойнее, чем стандартной rm, оперирующей и каталогами, и файлами: всегда точно знаешь, что если она сработала, в директории точно ничего важного забыто не было.


А затем исполним команду mount -a, которая монтирует файловые системы в соответствии с указаниями /etc/fstab/. И удостоверимся, что всё с нашими системами в порядке. Именно так они и будут монтироваться теперь сами после очередной загрузки.


И теперь с ними действительно всё в порядке: являясь участником группы dosers, пользователь dummy, от имени которого мы занимаемся тут изучением возможностей системы, в состоянии не только свободно читать файлы с Windows-разделов, но и создавать их там.


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