Опубликован: 22.06.2005 | Уровень: для всех | Доступ: платный | ВУЗ: Компания IBM
Лекция 5:

Доступ процессов к файлам и каталогам

< Лекция 4 || Лекция 5: 1234 || Лекция 6 >

Доступ к файлу и каталогу

Но довольно насилия. Пора Мефодию задуматься и о другой стороне работы с Linux: о правах и свободах. Для начала – о свободах. Таблица процессов содержит список важнейших объектов системы – процессов. Однако не менее важны и объекты другого класса, те, что доступны в файловой системе: файлы, каталоги и специальные файлы (символьные ссылки, устройства и т. п.). По отношению к объектам файловой системы процессы выступают в роли действующих субъектов: именно процессы пользуются файлами, создают, удаляют и изменяют их. Факт использования файла процессом называется доступом к файлу, а способ воспользоваться файлом (каталогом, ссылкой и т. д.) – видом доступа.

Чтение, запись и использование

Видов доступа в файловой системе Linux три. Доступ на чтение (read) разрешает получать информацию из объекта, доступ на запись (write) – изменять информацию в объекте, и доступ на использование (execute) – выполнить операцию, специфичную для данного типа объектов. Доступ к объекту можно изменить командой chmod ( ch ange mod e, сменить режим (доступа)). В простых случаях формат этой команды таков: chmod доступ объект, где объект – это имя файла, каталога и т. п., а доступ описывает вид доступа, который необходимо разрешить или запретить. Значение " +r " разрешает доступ к объекту на чтение ( r ead), " -r " – запрещает. Аналогично " +w ", " -w ", " +x " и " -x " разрешают и запрещают доступ на запись ( w rite) и использование (e x ecute).

Доступ к файлу

Доступ к файлу на чтение и запись – довольно очевидные понятия:

[methody@localhost methody]$ date > tmpfile 
[methody@localhost methody]$ cat tmpfile
 Срд Сен 22 14:52:03 MSD 2004
[methody@localhost methody]$ chmod -r tmpfile
[methody@localhost methody]$ cat tmpfile
 cat: tmpfile: Permission denied
[methody@localhost methody]$ date -u > tmpfile 
[methody@localhost methody]$ chmod +r tmpfile; chmod -w tmpfile 
[methody@localhost methody]$ cal > tmpfile
 -bash: tmpfile: Permission denied
[methody@localhost methody]$ cat tmpfile
 Срд Сен 22 10:52:35 UTC 2004
[methody@localhost methody]$ rm tmpfile
rm: удалить защищенный от записи обычный файл `tmpfile'? y
5.10. Что можно и что нельзя делать с файлом, доступ к которому ограничен

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

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

Сценарий

Исполняемые файлы в 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!
5.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
5.12. Создание sort-сценария

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

< Лекция 4 || Лекция 5: 1234 || Лекция 6 >
Тимур Булатов
Тимур Булатов

С момента выхода курса прошло достаточно много времени, и хотелось бы понимать, насколько курс является актуальным на сегодняшний день.

дмитрий шремзер
дмитрий шремзер

В поле PPID (" p arent p rocess id entificator") указан идентификатор родительского процесса, т. е. процессапородившего данный. Для ps это – bash, а для bash, очевидно, login

А что тогда находится в поле CMD?

Ердаулет Орынбасар
Ердаулет Орынбасар
Россия, Астана