Лабораторная
работа №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 байта. Разве информация о длине файла не является частью записи о
нем в каталоге?
О файлах
Если быть точными, каталог содержит не "файлы", а записи
о файлах, подобно тому, как библиотечный каталог содержит не книги, а
записи о книгах (библиографические карточки), а сами книги хранятся на полках
Часть полей, выдаваемых командой ls – l, относится к файлу как единице хранения,
а часть - к записи о нем в каталоге.
Атрибутом
записи о файле в каталоге является поле "имя".
Атрибутам
файла как единицы хранения (его называют индексным узлом, или и-узлом) соответствуют поля
"тип и права", "количество указателей",
"владелец", "группа-владелец", "размер",
"время модификации".
Поле
"количество указателей" содержит число записей в каталогах,
соответствующих и-узлу. Мы имели дело только с и-узлами, которым соответствует одна запись (файламы, создаваемые пользователями), но так же, как книге
могут соответствовать разные карточки (одна - в предметном каталоге, другая - в
алфавитном каталоге названий, третья - в алфавитном каталоге авторов...), на
один и тот же и-узел могут ссылаться записи в разных
каталогах (или разные записи в одном каталоге под разными именами).
Создание и удаление дополнительных имен ("ссылок") нами
рассматриваться здесь не будет.
В то
время как правомочия чтения и записи на каталог вполне прозрачны (разрешение
чтения позволяет прочитать список содержащихся в нем файлов (например, командой
ls), а записи - модифицировать этот список,
т.е. создавать и удалять содержащиеся в этом каталоге файлы), правомочие
исполнения имеет для каталога особый смысл. Оно означает "право
прохождения сквозь", т.е. право на обращение к файлам, содержащимся в
каталоге и в его подкаталогах, даже если права на чтение самого каталога нет.