Доступ процессов к файлам и каталогам
Доступ к файлу и каталогу
Но довольно насилия. Пора Мефодию задуматься и о другой стороне работы с 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'? y5.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 unsorted5.12. Создание sort-сценария
Утилита sort сортирует – расставляет в алфавитном, обратном алфавитном или другом порядке – строки передаваемого ей файла. То же самое произойдет, если сделать этот файл исполняемым, вписав в начало /bin/sort в качестве интерпретатора, а затем выполнить получившийся сценарий: запустится утилита sort, а сценарий (файл с неотсортированными строками) будет передан ей в качестве параметра. Оформлять файлы, которые необходимо отсортировать, в виде sort-сценариев довольно бессмысленно – Мефодий просто хотел еще раз убедиться, что сценарий можно написать для чего угодно.