Лабораторная работа №3

 Файлы и права доступа

 

ПЕРЕНАПРАВЛЕНИЕ ВВОДА-ВЫВОДА

Команды ср, ls, mkdir, mv, rm, rmdir, touch, с помощью которых манипулируют файлами относят к "файловым утилитам". Все они позволяют манипулировать файлом (копировать, выводить информацию о нем, переименовывать или перемещать, создавать) как единым целым. Любые действия файловых утилит совершенно безразличны к содержимому файлов.

Команда cat относится к "текстовым утилитам". Она может обрабатывать и двоичные файлы, но применительно к ним операция объединения ((con)catenate - "(кон)катенировать", "сцеплять") бессмысленна.

Команда cat без аргументов не приводит ни к какому видимому результату (не появляются вывод на экране, и нет подсказки, которая была бы знаком успешного завершения команды):

Команда cat не только выводит, но и вводит данные. Каждая введенная ею строка после нажатия [Enter] вновь выводится на терминал. Команда cat, поданная без аргумента, копирует содержимое ввода в вывод построчно (стандарт предусматривает также ключ -u, обеспечивающий побайтное, а не построчное копирование).

Закончить ввод можно, введя в начале очередной строки символ конца файла Ctrl+D Ввод этого символа приводит к немедленному завершению ввода, т.е. символ завершения строки уже не ожидается, а сам символ не отображается при вводе.

 

Вывод подразумевает вывод на экран, а ввод - ввод с клавиатуры. Это является умолчанием для всех стандартных команд. Однако одним из самых важных свойств открытых ОС является возможность перенаправления ввода-вывода.

В примере перенаправляется вывод команды cat, используя символ ">" (">" – «в файл») со следующим за ним именем файла (ОС), в который перенаправляется вывод.

В этом примере строки ввода уже не дублируются выводом на терминал, а поданная после завершения ввода команда ls показывает, что появился файл с названием ОС и размером 19 байта, что соответствует длине введенного текста (в однобайтовой кодировке).

Перенаправляться может и ввод. С помощью команды cat можно вывести содержимое созданного ею файла на терминал. Перенаправление ввода осуществляется указанием имени файла после символа "<"("<" -"из файла").  :

Промежутки до и после символов "<" и ">" игнорируются.

Перенаправление ввода и вывода может использоваться и одновременно. Команда копирует построчно файл ОС в файл ОС2.

Результат совпадает с результатом копирования ср ОС ОС2, хотя и достигается другим способом. Порядок указания файлов перенаправления ввода и вывода значения не имеет.

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

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

Как и перенаправление вывода в файл, перенаправление вывода в конец файла может применяться совместно с переназначением ввода.

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

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

В примере сообщение об отсутствии файла ОСЗ было выведено на терминал, хотя стандартный вывод был перенаправлен в файл список.

Перенаправить вывод ошибок можно, использовав конструкцию 2> со следующим за ней именем файла:

   

Двойка перед символом перенаправления в этой конструкции означает порядковый номер (дескриптор) канала ввода-вывода; стандартный ввод и стандартный вывод имеют дескрипторы 0 и 1, соответственно (дескрипторы 0, 1, 2 известны также как STDIN, STDOUT, STDERR), а запись "<"; ">", ">>" является сокращением от "0<", "1>", "1>>", соответственно (команда может открывать и большее количество файлов ввода-вывода, но лишь три из них ассоциируются с терминалом автоматически при ее подаче).

Так же, как и стандартный вывод, вывод ошибок может быть переназначен в конец существующего файла конструкцией 2>>. Если же необходимо переназначить и стандартный вывод, и вывод ошибок в один файл, в командную строку следует, помимо переназначения стандартного вывода, включить еще и конструкцию 2>&1, означающую "переназначить второй канал туда же, куда и первый":

 

СТАНДАРТНЫЕ ФАЙЛЫ-УСТРОЙСТВА

Бывает желательно подавить стандартный вывод или вывод ошибок вообще. Некоторые команды предусматривают для этого особые ключи, но в общем случае можно воспользоваться все той же возможностью переназначения вывода. Для этого в любой стандартной системе существует специальный файл, представляющий собою фиктивное "нуль-устройство". Его полное имя /dev/null. Запись в него любых данных не приводит к какому-либо результату, они как бы "бесследно исчезают" В /dev/null можно переназначить как стандартный вывод, так и вывод ошибок.

На /dev/null можно также переназначить и стандартный ввод; из него всегда читается пустой файл: подача команды cat </dev/null >пустой_файл приведет к появлению в текущем каталоге пустого файла пустой_файл (или опустошению существующего файла с таким именем).

Еще один интересный специальный файл-устройство - /dev/tty. Это весьма абстрактное устройство, соответствующее терминалу, с которого запущена оболочка. Перенаправление вывода или ввода из этого устройства не дает никакого видимого эффекта, поскольку совпадает с умолчанием (можно считать, что, если в команде явным образом не присутствуют перенаправления, ввод-вывод неявным образом направлен так: </dev/tty >/ dev/tty 2>/dev/tty), - но его указание может пригодиться для команд, вводящих текст из файла, указанного в качестве операнда, или выводящих текст в такой файл.

Если взглянуть на перечисленные файлы с помощью команды ls -l, мы обнаружим, что в поле тип присутствует символ с:.

          

Символ с означает "устройство с посимвольным вводом-выводом" [В строках вывода команды ls -l отсутствует поле размер; его место занимают пары чисел, называемых старшим и младшим номерами устройства (в данном случае "5, 1", "1, 3" и "5, 0"). Их значения зависят от конкретной реализации и интересны администратору системы, но не обычному пользователю.].

Эти файлы устройств должны присутствовать в любой стандартной открытой системе, так же как и содержащий их каталог /dev/. В большинстве реализаций этот каталог содержит также множество файлов (иногда организованных в подкаталоги), представляющих различные физические или виртуальные устройства. Любое устройство в открытой ОС представлено в виде файла. Некоторые из них (терминалы) представляют собой устройства с посимвольным вводом-выводом, некоторые (магнитные диски) - с поблочным. Тип файла-устройства с поблочным вводом-выводом обозначается буквой b.

 

ОБОЛОЧКА КАК КОМАНДА

Убедительной демонстрацией единства принципов открытых систем является следующий пример. Запишем в файл сценарий строки, соответствующие каким-либо командам (например, date, cal) и дадим команду sh <сценарий:

Команда sh запускает еще одну оболочку (В реальных ситуациях пользователь работает не со стандартной оболочкой sh, а с усовершенствованной оболочкой bash или zsh, совместимой сверху вниз со стандартной. При этом команда sh может быть, в зависимости от конкретной ОС, либо синонимом такой усовершенствованной, либо также включенной в систему строго стандартной оболочкой). Поскольку ввод перенаправлен, команды читаются не с терминала, а из файла.

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

 

"ВЛАДЕНИЕ" ФАЙЛОМ И "ПРАВА" НА НЕГО

Рассмотрим пример:

                                                                                                                                                           

Командами touch и ls создадим файл файл и убедимся в том, что он создан. Затем выполним команду chmod u-w файл и обнаружим, что поле тип и права доступа в выдаче "длинного" списка файлов претерпело некоторые изменения. Попытка перенаправить в этот файл ввод порождает сообщение оболочки "В доступе отказано".

Значения полей в "длинном" формате списка файлов, получаемого по команде ls l:

Устройство поля тип и права:

Оно всегда содержит десять символов. Значение первого символа: это тип файла, которому могут соответствовать "-" (обычный файл), d (каталог) и некоторые другие символы, соответствующие специальным файлам (таким, как файлы устройств).

Остальные девять символов составляют три триады, выражающие права на файл в так называемой "rwx"-нотации. Они соответствуют трем категориям пользователей, определяемым относительно каждого файла.

В первую категорию "владелец" входит один пользователь, являющийся "владельцем" данного файла. Это пользователь, чье имя указано в соответствующем (третьем) поле "длинного" формата списка файлов. Обычно владелец файла - это создавший его пользователь.

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

В примере имя группы совпадает с именем пользователя (Это концепция так называемых "собственных групп", поддерживаемая во многих системах GNU/Linux), но это разные сущности.

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

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

·        Правомочие чтения разрешает чтение содержимого файла. Значение этого символа может быть "-" (запрещено) или "r" (разрешено; от англ. read - читать).

·        Правомочие записи разрешает модификацию файла, его значение может быть "-"  (запрещено) или "w" (разрешено; от англ. write - писать).

·        Правомочие исполнения разрешает выполнение программы, содержащейся в файле, путем указания ее имени. Значение этого бита может быть "-" (запрещено) или "х" (разрешено; от англ. eXecute - исполнять) (В этом же поле отображаются и другие правомочия. Если в этом поле присутствует другая буква, строчная буква (например, "s") означает исполняемый файл, а заглавная (например, "S") – неисполняемый).

Ограничения системы прав на файлы не действуют для главного пользователя (root). Главный пользователь может читать любые файлы в структуре, писать любые файлы, кроме расположенных в подструктурах, смонтированных только для чтения, и исполнять любые файлы, исполнение которых разрешено хотя бы одной категории пользователей.

Изменять права доступа к файлу может лишь его владелец (или главный пользователь системы). Для этого служит команда chmod (change mode - изменить режим доступа к файлу). Синтаксис этой команды поддерживает две нотации - символическую и числовую.

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

Категории пользователей соответствуют описанным выше и обозначаются последовательностями букв:

"u"        владелец файла (user - пользователь);

"g"        группа - владелец файла (group - группа);

"о"       остальные пользователи (other - прочие);

"а"        все пользователи (all - все), это сокращенная запись для "ugo".

Вид назначения прав может быть трояким:

"+"       добавить правомочия;

"-"        отнять правомочия;

"="       установить права, в точности соответствующие назначаемым.

Назначаемые правомочия обозначаются последовательностями уже известных нам букв "rwx''-нотации "г", "w", "x", соответствующим правам на чтение, запись и исполнение.

Таким образом,

chmod u-w файл                                    отнимет правомочие записи у владельца;

chmod g+rw файл                     добавит правомочия чтения и записи группе-владельцу;

chmod go=r                                  установит правомочия группы-владельца и прочих пользователей в точности равными "только чтению";

chmod а+х                                    добавит правомочие исполнения всем пользователям;

chmod u=rwx, g=rw, o=r    установит правомочия чтения, записи и исполнения для пользователя, чтения и записи для группы и чтения для всех остальных.

 

Маска прав по умолчанию

Когда пользователь создает файл (командой touch или перенаправлением вывода другой команды), права доступа к нему устанавливаются равными маске прав по умолчанию, за исключением того, что правомочие исполнения обычному файлу не присваиваются. Права по умолчанию задаются командой umask.

Команда umask -S без параметров выводит в символическом виде маску прав по умолчанию. Команда umask с параметром в "ugo''-нотации (такой же, как; у команды chmod) добавляет, отнимает или устанавливает права в маске прав.

 

В примере выводт маску, создает файл файл_1, убеждается в том, что права на вновь созданный файл соответствуют маске, отнимает у прочих пользователей вновь создаваемых файлов правомочие чтения, создает файл файл_2 и убеждается в том, что права на него соответствуют новому значению маски.

Утилита umask не является файловой, и изменение значения маски не влияет на права существующих файлов. Значение маски сохраняется до нового их изменения командой umask или конца сеанса работы с оболочкой.

 

Особенности прав на каталоги

 

     

У Вас нет прав на запись в файл файл. Тем не менее Вы можете удалить его командой rm. Никакого противоречия в этом нет. Удаление файла не является изменением его содержания. Удаление файла - это изменение каталога, в котором он содержится, и, соответственно, разрешение или запрещение удаления файла зависит не от прав на него, но от прав на каталог (каталог - это тоже файл).

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

Соответственно, и создать файл в каталоге, прав записи на который нет, невозможно (Во многих системах крайне полезным оказывается определить особый режим для некоторых каталогов, при котором пользователь имеет право создавать в нем новые файлы, но удалять может лишь те, что принадлежат ему. Для этого стандарт предусматривает расширение набора прав, известное, как "липкий бит'').

Отсутствие права записи в каталог не отнимает права на изменение содержимого находящихся в нем файлов:

Это вполне логично, так как изменение содержимого никак не влияет на запись в каталоге. Однако здесь есть одна тонкость. Обратите внимание, что первая команда ls -l показала длину файла равной 0 байт (что естественно, так как этот файл создавался как пустой), а вторая - 4 байта. Разве информация о длине файла не является частью записи о нем в каталоге?

 

О файлах

Если быть точными, каталог содержит не "файлы", а записи о файлах, подобно тому, как библиотечный каталог содержит не книги, а записи о книгах (библиографические карточки), а сами книги хранятся на полках Часть полей, выдаваемых командой lsl, относится к файлу как единице хранения, а часть - к записи о нем в каталоге.

Атрибутом записи о файле в каталоге является поле "имя".

Атрибутам файла как единицы хранения (его называют индексным узлом, или и-узлом) соответствуют поля "тип и права", "количество указателей", "владелец", "группа-владелец", "размер", "время модификации".

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

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

 

[Курс] [Помощь]