Загрузки системы. В процессе загрузки будет запущена основная управляющая программа ядро



страница8/16
Дата22.11.2016
Размер6.23 Mb.
Просмотров701
Скачиваний0
1   ...   4   5   6   7   8   9   10   11   ...   16

Пример 10. Что можно и что нельзя делать с файлом, доступ к которому ограничен

Следует заметить, что Мефодию известна операция перенаправления вывода — “>”, с помощью которой он создаёт файлы в своём домашнем каталоге. Добавление “> файл” в командную строку приводит к тому, что всё, что вывелось бы на экран терминала2, попадает в файл. Мефодий создаёт файл, проверяет, можно ли из него читать, командой cat, запрещает доступ на чтение и снова проверяет: на этот раз cat сообщает об отказе в доступе («Permission denied»). Тем не менее записать в этот файл, перенаправив выдачу date -u оказывается возможным, потому что доступ на запись не закрыт. Если же закрыть доступ на запись, а доступ на чтение открыть (Мефодий сделал это в одной командной строке, разделив команды символом “;”), невозможным станет изменение этого файла: попытка перенаправить вывод программы cal будет неуспешной, а чтение снова заработает. Сработает и удаление этого файла, хотя rm, на всякий случай, предупредит о том, что файл защищён от записи.

Доступ к файлу на использование означает возможность запустить этот файл в качестве программы, выполнить его. Например, все файлы из каталога /bin (в том числе /bin/ls, /bin/rm, /bin/cat, /bin/echo и /bin/date) — исполняемые, т. е. доступны на использование, и оттого их можно применять в командной строке в качестве команд. В общем случае необходимо указать путь к программе, например, /bin/ls, однако программы, находящиеся в каталогах, перечисленных в переменной окружения PATH, можно вызывать просто по имени: ls (подробнее о переменных окружения рассказано в лекции Возможности командной оболочки).

Сценарий

Исполняемые файлы в Linux бывают ровно двух видов. Первый — это файлы в собственно исполняемом (executable) формате. Как правило, такие файлы — результат компиляции программ, написанных на классических языках программирования, вроде Си. Попытка прочитать такой файл с помощью, например, cat не приведёт ни к чему полезному: на экран полезут разнообразные бессмысленные символы, в том числе — управляющие. Это — так называемые машинные коды — язык, понятный только компьютеру. В Linux используется несколько форматов исполняемых файлов, состоящих из машинных кодов и служебной информации, необходимой операционной системе для запуска программы: согласно этой информации, ядро Linux выделяет для запускаемой программы оперативную память, загружает программу из файла и передаёт ей управление. Большинство утилит Linux — программы именно такого, «двоичного» формата.

Второй вид исполняемых файлов — сценарии. Сценарий — это текстовый файл, предназначенный для обработки какой-нибудь утилитой. Чаще всего такая утилита — это интерпретатор некоторого языка программирования, а содержимое такого файла — программа на этом языке. Мефодий уже написал один сценарий для sh: бесконечно выполняющуюся программу loop. Поскольку к тому времени он ещё не знал, как пользоваться chmod, ему всякий раз приходилось явно указывать интерпретатор (sh или bash), а сценарий передавать ему в виде параметра (см. примеры в разделе Процессы).


сценарий

Исполняемый текстовый файл. Для выполнения сценария требуется программа-интерпретатор, путь к которой может быть указан в начале сценария в виде “#!путь_к_интерпретатору”. Если интерпретатор не задан, им считается /bin/sh.


Если же сделать файл исполняемым, то ту же самую процедуру — запуск интерпретатора и передачу ему сценария в качестве параметра командной строки — будет выполнять система:
[methody@localhost methody]$ cat > script

echo 'Hello, Methody!'

^D

[methody@localhost methody]$ ./script



-bash: ./script: Permission denied

[methody@localhost methody]$ sh script

Hello, Methody!

[methody@localhost methody]$ chmod +x script

[methody@localhost methody]$ ./script

Hello, Methody!


Пример 11. Создание простейшего исполняемого сценария

С первого раза Мефодию не удалось запустить сценарий script, потому что по умолчанию файл создаётся доступным на запись и чтение, но не на использование. После chmod +x файл стал исполняемым. Поскольку домашний каталог Мефодия не входил в PATH, пришлось использовать путь до созданного сценария, благо путь оказался недлинным: “текущий_каталог/имя_сценария”, т. е. ./script.

Если системе не намекнуть специально, в качестве интерпретатора она запускает стандартный shell — /bin/sh. Однако есть возможность написать сценарий для любой утилиты, в том числе и написанной самостоятельно. Для этого первыми двумя байтами сценария должны быть символы “#!”, тогда всю его первую строку, начиная с третьего байта, система воспримет как команду обработки. Исполнение такого сценария приведёт к запуску указанной после “#!” команды, последним параметром которой добавится имя самого файла сценария.

[methody@localhost methody]$ cat > to.sort

#!/bin/sort

some


unsorted

lines


[methody@localhost methody]$ sort to.sort

#!/bin/sort

lines

some


unsorted

[methody@localhost methody]$ chmod +x to.sort

[methody@localhost methody]$ ./to.sort

#!/bin/sort

lines

some


unsorted
Пример 12. Создание sort-сценария

Утилита sort сортирует — расставляет их в алфавитном, обратном алфавитном или другом порядке — строки передаваемого ей файла. Совершенно то же самое произойдёт, если сделать этот файл исполняемым, вписав в начало /bin/sort в качестве интерпретатора, а затем выполнить получившийся сценарий: запустится утилита sort, а сценарий (файл с неотсортированными строками) передастся ей в качестве параметра. Оформлять файлы, которые необходимо отсортировать, в виде sort-сценариев довольно бессмысленно, просто Мефодий хотел ещё раз убедиться, что сценарий можно написать для чего угодно.



Доступ к каталогу

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


[methody@localhost methody]$ mkdir dir

[methody@localhost methody]$ date > dir/smallfile

[methody@localhost methody]$ /bin/ls dir

smallfile

[methody@localhost methody]$ cd dir

[methody@localhost dir]$ pwd

/home/methody/dir

[methody@localhost dir]$ cd

[methody@localhost methody]$ pwd

/home/methody

[methody@localhost methody]$ cat dir/smallfile

Срд Сен 22 13:15:20 MSD 2004
Пример 13. Доступ к каталогу на чтение и использование

Мефодий создал каталог dir и файл в smallfile в нём. При смене текущего каталога bash автоматически изменил строку-подсказку: как было сказано в лекции Работа с файловой системой, последнее слово этой подсказки — имя текущего каталога. Описанная в той же лекции команда pwd (print work directory) подтверждает это. Команда cd без параметров, как ей это и полагается, делает текущим домашний каталог пользователя.


[methody@localhost methody]$ chmod -x dir

[methody@localhost methody]$ ls dir

ls: dir/smallfile: Permission denied

[methody@localhost methody]$ alias ls

alias ls='ls --color=auto'

[methody@localhost methody]$ /bin/ls dir

smallfile

[methody@localhost methody]$ cd dir

-bash: cd: dir: Permission denied

[methody@localhost methody]$ cat dir/smallfile

cat: dir/smallfile: Permission denied


Пример 14. Доступ к каталогу на чтение без использования

Мефодий запретил доступ на использование каталога, ожидая, что просмотреть его содержимое с помощью ls будет можно, а сделать его текущим и добыть содержимое находящегося в нём файла — нельзя. Неожиданно команда ls выдала ошибку. Проницательный Мефодий заметил, что имя файла — smallfile, команда ls всё-таки добыла, но ей зачем-то понадобился и сам файл. Гуревич посоветовал посмотреть, что выдаст команда alias ls. Оказывается, вместо простого ls умный bash подставляет специфичную для Linux команду ls --color=auto, которая раскрашивает имена файлов в разные цвета в зависимости от их типа. Для того, чтобы определить тип файла (например, запускаемый ли он) необходимо получить к нему доступ, а этого-то и нельзя сделать, когда нельзя использовать каталог. Если явно вызывать утилиту ls (/bin/ls), поведение каталога становится вполне предсказуемым. Подробнее о том, чем занимается команда alias (о сокращениях), рассказывается в лекции Возможности командной оболочки.


[methody@localhost methody]$ chmod +x dir; chmod -r dir

[methody@localhost methody]$ /bin/ls dir

/bin/ls: dir: Permission denied

[methody@localhost methody]$ cat dir/smallfile

Срд Сен 22 13:15:20 MSD 2004

[methody@localhost methody]$ cd dir

[methody@localhost dir]$ /bin/ls

ls: .: Permission denied

[methody@localhost dir]$ cd

[methody@localhost methody]$
Пример 15. Доступ к каталогу на использование без чтения

Если каталог, доступный на чтение, но недоступный на использование, мало когда нужен, то каталог, доступный на использование, но не на чтение, может пригодиться. Как видно из примера, получить список файлов, находящихся в таком каталоге, не удастся, но получить доступ к самим файлам, зная из имена — можно. Мефодий тут же захотел положить в созданный каталог какой-нибудь нужный, но очень секретный файл, чтобы имя этого файла никто, кроме близких друзей не знал. Поразмыслив, Мефодий отказался от этой затеи: во-первых, не без оснований подозревая, что администратор (суперпользователь) всё равно сможет просмотреть содержимое такого каталога, а во-вторых, потому что нужного, но очень секретного файла под рукой не оказалось.


[methody@localhost methody]$ rm -rf dir

rm: невозможно открыть каталог `dir': Permission denied

[methody@localhost methody]$ chmod -R +rwX dir

[methody@localhost methody]$ rm -rf dir
Пример 16. Рекурсивное удаление каталога

Потеряв интерес к секретным файлам, Мефодий решил удалить каталог dir. Из лекции Работа с файловой системой он знает, что это можно сделать не с помощью rmdir, а с помощью rm с ключом “-r” (recursive). Но сходу воспользоваться rm не удалось: чтение-то из каталога невозможно, и потому неизвестно, какие файлы там надо удалять. Поэтому сначала надо разрешить все виды доступа к dir. На всякий случай (а вдруг внутри dir попадётся такой же нечитаемый подкаталог?) Мефодий выполняет рекурсивный вариант chmod — с ключом “-R” (“R” здесь большое, а не маленькое, потому что “-r” уже занято: означает запрет чтения). Команда chmod -R +rwX dir делает все файлы и каталоги в dir доступными на чтение и запись; и все каталоги — доступными на использование. Параметр “X” (большое) устанавливает доступ на использование файла, только если этот доступ уже был разрешён хоть кому нибудь (хозяину, группе или всем остальным). Он позволяет не делать запускаемыми все файлы подряд... впрочем, кого это тревожит, если следующей командой будет rm?


1 Имя этого сигнала происходит не от казни через повешение, а от повешенной телефонной трубки.

2 Точнее, на стандартный вывод программы, такое перенаправление не касается стандартного вывода ошибок.



Права доступа

Работая с Linux, Мефодий заметил, что некоторые файлы и каталоги недоступны ему ни на чтение, ни на запись, ни на использование. Зачем такие нужны? Оказывается, другие пользователи могут обращаться к этим файлам, а у Мефодия просто не хватает прав.



Идентификатор пользователя

Говоря о правах доступа пользователя к файлам, стоит заметить, что в действительности манипулирует файлами не сам пользователь, а запущенный им процесс (например, утилита rm или cat). Поскольку и файл, и процесс создаются и управляются системой, ей нетрудно организовать какую угодно политику доступа одних к другим, основываясь на любых свойствах процессов как субъектов и файлов как объектов системы.

В Linux, однако, используются не какие угодно свойства, а результат идентификации пользователя — его UID. Каждый процесс системы обязательно принадлежит какому-нибудь пользователю, и идентификатор пользователя (UID) — обязательное свойство любого процесса Linux. Когда программа login запускает стартовый командный интерпретатор, она приписывает ему UID, полученный в результате диалога. Обычный запуск программы (exec()) или порождение нового процесса (fork()) не изменяют UID процесса, поэтому все процессы, запущенные пользователем во время терминальной сессии, будут иметь его идентификатор.

Поскольку UID однозначно определяется входным именем, оно нередко используется вместо идентификатора — для наглядности. Например, вместо выражения «идентификатор пользователя, соответствующий входному имени methody», говорят «UID methody» (в примере ниже этот идентификатор равен 503),


[methody@localhost methody]$ id

uid=503(methody) gid=503(methody) группы=503(methody)

[methody@localhost methody]$ id shogun

uid=400(shogun) gid=400(shogun) группы=400(shogun),4(adm),10(wheel),19(proc)
Пример 1. Как узнать идентификаторы пользователя и членство в группах

Утилита id, которой воспользовался Мефодий, выводит входное имя пользователя и соответствующий ему UID, а также группу по умолчанию и полный список групп, членом которых он является.



Идентификатор группы

Как было рассказано в лекции Сеанс работы в Linux, пользователь может быть членом нескольких групп, равно как и несколько пользователей может быть членами одной и той же группы. Исторически сложилось так, что одна из групп — группа по умолчанию — является для пользователя основной: когда (не вполне точно) говорят о «GID пользователя», имеют в виду именно идентификатор группы по умолчанию. В лекции Конфигурационные файлы будет рассказано, что GID пользователя вписан в учётную запись и хранится в /etc/passwd, а информация о соответствии имён групп их идентификаторам, равно как и о том, в какие ещё группы входит пользователь — в файле /etc/group. Из этого следует, что пользователь не может не быть членом как минимум одной группы, как снаряд не может не попасть в эпицентр взрыва1.

Часто процедуру создания пользователя проектируют так, что имя группы по умолчанию совпадает с входным именем пользователя, а GID пользователя — с его UID. Однако это совсем не обязательно: не всегда нужно заводить для пользователя отдельную группу, а если заводить, то не всегда удаётся сделать так,чтобы желаемый идентификатор группы совпадал с желаемым идентификатором пользователя.

Ярлыки объектов файловой системы

При создании объектов файловой системы — файлов, каталогов и т. п. — каждому в обязательном порядке приписывается ярлык. Ярлык включает в себя UID — идентификатор пользователя-хозяина файла, GID — идентификатор группы, которой принадлежит файл, тип объекта и набор т. н. атрибутов, а также некоторую дополнительную информацию. Атрибуты определяют, кто и что с файлом имеет право делать, и описаны ниже.

[methody@arnor methody]$ ls -l

итого 24

drwx------ 2 methody methody 4096 Сен 12 13:58 Documents

drwxr-xr-x 2 methody methody 4096 Окт 31 15:21 examples

-rw-r--r-- 1 methody methody 26 Сен 22 15:21 loop

-rwxr-xr-x 1 methody methody 23 Сен 27 13:27 script

drwx------ 2 methody methody 4096 Окт 1 15:07 tmp

-rwxr-xr-x 1 methody methody 32 Сен 22 13:26 to.sort
Пример 2. Права доступа к файлам и каталогам, показанные командой ls -l

Ключ “-l” утилиты ls определяет «длинный» (long) формат выдачи (справа налево): имя файла, время последнего изменения файла, размер в байтах, группа, хозяин, количество жёстких ссылок и строчка атрибутов. Первый символ в строчке атрибутов определяет тип файла. Тип “-” отвечает «обычному» файлу, а тип “d” — каталогу (directory). Имя пользователя и имя группы, которым принадлежит содержимое домашнего каталога Мефодия, — естественно, methody.

Быстрый разумом Мефодий немедленно заинтересовался вот чем: несмотря на то, что создание жёстких ссылок на каталог невозможно, поле «количество жёстких ссылок» для всех каталогов примера равно двум, а не одному. На самом деле этого и следовало ожидать, потому что любой каталог файловой системы Linux всегда имеет не менее двух имён: собственное (например, tmp) и имя “.” в самом этом каталоге (tmp/.). Если же в каталоге создать подкаталог, количество жёстких ссылок на этот каталог увеличится на 1 за счёт имени “..” в подкаталоге (например, tmp/subdir1/..):
[methody@arnor methody]$ ls -ld tmp

drwx------ 3 methody methody 4096 Окт 1 15:07 tmp

[methody@arnor methody]$ mkdir tmp/subdir2

[methody@arnor methody]$ ls -ld tmp

drwx------ 4 methody methody 4096 Окт 1 15:07 tmp

[methody@arnor methody]$ rmdir tmp/subdir*

[methody@arnor methody]$ ls -ld tmp

drwx------ 2 methody methody 4096 Окт 1 15:07 tmp


Пример 3. Несколько жёстких ссылок на каталог всё-таки бывают!

Здесь Мефодий использовал ключ “-d” (directory) для того, чтобы ls выводил информацию не о содержимом каталога tmp, а о самом этом каталоге.

Пример от рута есть смысл приводить только в том случае, если пример на что-то совершенно универсальное, что обязательно будет устроено точно так же в любом Линуксе. Иначе есть опасность, что пользователь начнёт мудрить — и что он там намудрит... В Linux определено несколько системных групп, задача которых — обеспечивать доступ членов этих групп к разнообразным ресурсам системы. Часто такие группы носят говорящие названия: “disk”, “audio”, “cdwriter” и т. п. Тогда обычным пользователям доступ к некоторому файлу, каталогу или файлу-дырке Linux закрыт, но открыт членам группы, которой этот объект принадлежит.

Например, в Linux почти всегда используется виртуальная файловая система /proc — каталог, в котором в виде подкаталогов и файлов представлена информация из таблицы процессов. Имя подкаталога /proc совпадает с PID соответствующего процесса, а содержимое этого подкаталога отражает свойства процесса. Хозяином такого подкаталога будет хозяин процесса (с правами на чтение и использование), поэтому любой пользователь сможет посмотреть информацию о своих процессах. Именно каталогом /proc пользуется утилита ps:


[methody@arnor methody]$ ls -l /proc

. . .


dr-xr-x--- 3 methody proc 0 Сен 22 18:17 4529

dr-xr-x--- 3 shogun proc 0 Сен 22 18:17 4558

dr-xr-x--- 3 methody proc 0 Сен 22 18:17 4589

. . .


[methody@localhost methody]$ ps -af

UID PID PPID C STIME TTY TIME CMD

methody 4529 4523 0 13:41 tty1 00:00:00 -bash

methody 4590 4529 0 13:42 tty1 00:00:00 ps -af


Пример 4. Ограничение доступа к полной таблице процессов

Оказывается, запущено немало процессов, в том числе один — пользователем shogun (PID 4558). Однако, несмотря на ключ “-a” (all), ps выдала Мефодию только сведения о его процессах: 4529 — это входной shell, а 4589 — видимо, сам ls.

Другое дело — Гуревич. Он, как видно из примера $ID, входит в группу proc, членам которой разрешено читать и использовать каждый подкаталог /proc.
shogun@localhost ~ $ ps -af

UID PID PPID C STIME TTY TIME CMD

methody 4529 4523 0 13:41 tty1 00:00:00 -bash

shogun 4558 1828 0 13:41 tty3 00:00:00 -zsh

shogun 4598 4558 0 13:41 tty3 00:00:00 ps -af
Пример 5. Доступ к полной таблице процессов: группа proc

Гуревич, опытный пользователь Linux, предпочитает bash-у «The Z Shell», zsh. Отсюда и различие приглашения в командной строке. Во всех shell-ах, кроме самых старых, символ “~” означает домашний каталог. Этим сокращением удобно пользоваться, если текущий каталог — не домашний, а оттуда (или туда) нужно скопировать файл. Получается команда наподобие “cp ~/нужный_файл .” или “cp нужный_файл ~” соответственно.

Команда ps -a выводит информацию обо всех процессах, запущенных «живыми» (а не системными) пользователями2. Для просмотра всех процессов Гуревич пользуется командой ps -efH.

Разделяемые каталоги

Проанализировав систему прав доступа к каталогам в Linux, Мефодий пришёл к выводу, что в ней имеется существенный недочёт. Тот, кто имеет право изменять каталог, может удалить любой файл оттуда, даже такой, к которому совершенно не имеет доступа. Формально всё правильно: удаление файла из каталога — всего лишь изменение содержимого каталога. Если у файла было больше одного имени (существовало несколько жёстких ссылок на этот файл), никакого удаления данных не произойдёт, а если ссылка была последней — файл в самом деле удалится. Вот это-то, по мнению Мефодия, и плохо.

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


[methody@localhost methody]$ ls

4TO-TO Mep3koe Documents examples loop script tmp to.sort

[methody@localhost methody]$ ls -l 4*

-rw------- 1 root root 0 Сен 22 22:20 4TO-TO Mep3koe

[methody@localhost methody]$ rm -i 4*

rm: удалить защищённый от записи пустой обычный файл `4TO-TO Mep3koe'? y


Пример 6. Удаление чужого файла с неудобным именем

Подозревая, что от хулиганов всего можно ожидать, Мефодий не решился набрать имя удаляемого файла с клавиатуры, а воспользовался шаблоном и ключом “-i” (interactive) команды rm, чтобы та ожидала подтверждения перед тем, как удалять очередной файл. Несмотря на отсутствие доступа к самому файлу, удалить его оказалось возможно.


[methody@localhost methody]$ ls -dl /tmp

drwxrwxrwt 4 root root 1024 Сен 22 22:30 /tmp

[methody@localhost methody]$ ls -l /tmp

итого 4

-rw-r--r-- 1 root root 13 Сен 22 17:49 read.all



-rw-r----- 1 root methody 23 Сен 22 17:49 read.methody

-rw------- 1 methody root 25 Сен 22 22:30 read.Methody

-rw-r----- 1 root wheel 21 Сен 22 17:49 read.wheel

[methody@localhost methody]$ rm -f /tmp/read.*

rm: невозможно удалить `/tmp/read.all': Operation not permitted

rm: невозможно удалить `/tmp/read.methody': Operation not permitted

rm: невозможно удалить `/tmp/read.wheel': Operation not permitted

[methody@localhost methody]$ ls /tmp

read.all read.methody read.wheel



Поделитесь с Вашими друзьями:
1   ...   4   5   6   7   8   9   10   11   ...   16


База данных защищена авторским правом ©nethash.ru 2017
обратиться к администрации

войти | регистрация
    Главная страница


загрузить материал