Copyleft (no c) - Fuck copyright! 1999-2003 В. Кравчук , OpenXS Initiative , идея, составление, перевод, примеры
Для установки (изменения) прав доступа к файлу используется команда chmod . Она имеет следующий синтаксис:
chmod [ -fR ] абсолютные_права файл ... chmod [ -fR ] символьное_изменение_прав файл ...
Команда chmod устанавливает права доступа к указанным файлам. Права доступа к файлу может изменять или устанавливать только его владелец или пользователь root . Опция -f означает, что команда не будет сообщать о невозможности установки прав доступа. Опция -R означает, что заданное изменение прав доступа будет применяться рекурсивно для всех подкаталогов, указанных в списке файлов.
Абсолютные права доступа задаются восьмеричным числом, расчет которого (в соответствии с табл. 11 ) описан в предыдущем разделе. Описанию синтаксиса, используемого для задания символьного изменения прав доступа, посвящен следующий подраздел.
Символьное изменение прав доступа задается в виде списка, через запятую, выражений следующего вида:
[пользователи ] оператор [права ]
Компонент пользователи определяет, для кого задаются или изменяются права. Он может иметь значения u , g , o и a , задающие изменения прав для владельца, группы, прочих пользователей и всех категорий пользователей. Если пользователи не указаны, права изменяются для всех категорий пользователей. Однако при этом не переопределяются установки, задаваемые маской создания файлов (umask ).
Компонент оператор может иметь значения + , - или = , означающие добавление, отмену права доступа и установку в точности указанных прав, соответственно. Если после оператора = права не указаны, все права доступа для соответствующих категорий пользователей отменяются.
Компонент права задается в виде любой совместимой комбинации следующих символов:
r
право на чтение
w
право на запись
x
право на выполнение
l
блокирование изменения прав доступа
s
выполнение с эффективным идентификатором владельца или группы-владельца
t
клейкий бит
Не все сочетания символов для компонента пользователи и компонента права допустимы. Так, s можно задавать только для u или g , а t - только для u . Права x и s не совместимы с l и т.д.
Изменения прав доступа в списке выполняются последовательно, в порядке их перечисления.
Рассмотрим пример изменения прав доступа:
[kravchuk@arturo 10:51:43 /]$ cd /tmp
[kravchuk@arturo 10:51:46 /tmp]$ >f1.txt
[kravchuk@arturo 10:52:01 /tmp]$ chmod +w f1.txt
[kravchuk@arturo 10:52:13 /tmp]$ ls -l *.txt
-rw-r--r-- 1 kravchuk 50 0 Мар 27 10:52 f1.txt
[kravchuk@arturo 10:52:17 /tmp]$ chmod a+w f1.txt
[kravchuk@arturo 10:52:32 /tmp]$ ls -l *.txt
-rw-rw-rw- 1 kravchuk 50 0 Мар 27 10:52 f1.txt
[kravchuk@arturo 10:52:33 /tmp]$ chmod u+x,g=x,o= f1.txt
[kravchuk@arturo 10:53:18 /tmp]$ ls -l *.txt
-rwx--x--- 1 kravchuk 50 0 Мар 27 10:52 f1.txt
[kravchuk@arturo 10:53:20 /tmp]$ chmod ug-x,og+r,u=rwx f1.txt
[kravchuk@arturo 10:54:46 /tmp]$ ls -l *.txt
-rwxr--r-- 1 kravchuk 50 0 Мар 27 10:52 f1.txt
[kravchuk@arturo 10:55:15 /tmp]$ chmod 644 f1.txt
[kravchuk@arturo 10:55:23 /tmp]$ ls -l *.txt
-rw-r--r-- 1 kravchuk 50 0 Мар 27 10:52 f1.txt
Рассмотрим еще один пример, показывающий значение и изменение прав доступа к каталогу:
[kravchuk@arturo 11:05:38 /tmp]$ ls -l | grep d1
drw-r--r-- 2 kravchuk 50 108 Мар 26 17:39 d1
[kravchuk@arturo 11:05:47 /tmp]$ cd d1
bash: cd: d1: Permission denied
[kravchuk@arturo 11:05:57 /tmp]$ chmod 744 d1
[kravchuk@arturo 11:06:26 /tmp]$ cd d1
[kravchuk@arturo 11:06:27 /tmp/d1]$ cd ..
[kravchuk@arturo 11:06:39 /tmp]$ chmod -w d1
[kravchuk@arturo 11:06:51 /tmp]$ cd d1
[kravchuk@arturo 11:06:58 /tmp/d1]$ ls
f3.txt
[kravchuk@arturo 11:06:59 /tmp/d1]$ rm f3.txt
rm: f3.txt not removed: Permission denied
Новый файл создается с правами доступа, определяемыми пользовательской маской режима создания файлов. Команда umask (встроенная команда интерпретатора) присваивает пользовательской маске режима создания файлов указанное восьмеричное значение. Три восьмеричные цифры соответствуют правам на чтение/запись/выполнение для владельца, членов группы и прочих пользователей, соответственно.
Команда umask имеет следующий синтаксис:
umask [ -S ] [ маска ]
Если параметры не указаны, команда umask выдает текущее значение маски. По умолчанию, значение выдается и задается в восьмеричном виде как число, которое необходимо "вычесть" из максимальных прав доступа (777 для выполняемых файлов, которые создаются компиляторами, и 666 для обычных файлов):
[kravchuk@arturo 11:22:55 /tmp/d1]$ umask
022
При такой маске обычные текстовые файлы будут создаваться с правами 666 - 022 = 644 : [kravchuk@arturo 11:33:43 /tmp]$ >f5.txt
[kravchuk@arturo 11:33:48 /tmp]$ ls -l f5*
-rw-r--r-- 1 kravchuk 50 0 Мар 27 11:33 f5.txt
Операция "вычитания" для значения маски формально выполняется как побитовое логическое И дополнения маски и максимальных прав доступа. Рассмотрим пример расчета:
Двоичное значение маски:
000010010
Дополнение маски:
111101101
Максимальное значение прав:
110110110
Логическое И предыдущих двух строк:
110100100
Результирующие биты прав:
110100100 (644)
Для выполняемых файлов, создаваемых, например, компилятором языка C:
Двоичное значение маски:
000010010
Дополнение маски:
111101101
Максимальное значение прав:
111111111
Логическое И предыдущих двух строк:
111101101
Результирующие биты прав:
111101101 (755)
Опция -S требует выдавать маску в символьном виде, показывая, какие биты прав доступа будут установлены у создаваемого файла (также с учетом того, создается ли выполняемый или обычный текстовый файл):
[kravchuk@arturo 11:23:00 /tmp/d1]$ umask -S
u=rwx,g=rx,o=rx
Команду umask целесообразно включить в файлы начального запуска, задающие среду для начального командного интерпретатора.
Рассмотрим еще один пример создания файла при другом значении маски:
[kravchuk@arturo 11:33:52 /tmp]$ umask 257
[kravchuk@arturo 11:41:39 /tmp]$ umask -S
u=rx,g=w,o=
[kravchuk@arturo 11:41:43 /tmp]$ >f6.txt
[kravchuk@arturo 11:41:55 /tmp]$ ls -l f6*
-r---w---- 1 kravchuk 50 0 Мар 27 11:41 f6.txt
Владелец файла, а также пользователь root может изменять владельца и группу-владельца файла. Для изменения владельца (и группы-владельца) файла используется команда chown со следующим синтаксисом:
chown [-h][-R] владелец [:группа ] файл ...
Опция -h требует изменять владельца файла, на который указывает символическая связь, а не самой связи, как происходит по умолчанию. Опция -R требует рекурсивно изменить владельца во всех подкаталогах.
Для изменения только группы, владеющей файлом, используется команда chgrp :
chgrp [-h][-R] группа файл ...
Ее опции аналогичны команде chown .
Учтите, что после передачи файла другому владельцу, первоначальный владелец перестает им обладать, и будет иметь права доступа, установленные новым владельцем.
Рассмотрим простой пример:
$ ls -l
total 2
-rw-r--r-- 1 user01 others 6 Dec 10 16:19 testfile
$ chown informix testfile
$ ls -l
total 2
-rw-r--r-- 1 informix others 6 Dec 10 16:19 testfile
$ logname
user01
$ chown user01 testfile
UX:chown: ERROR: testfile: Not privileged
В логической файловой системе ОС UNIX - тысячи файлов, поэтому необходимы средства поиска файлов по различным критериям. Для поиска файлов предназначена команда find со следующим синтаксисом:
find каталог ... выражение
Утилита find просматривает иерархии каталогов в поисках файлов, удовлетворяющих критерию, задаваемому выражением. Выражения строятся из элементов с использованием следующих конструкций:
( элемент )
Истинно, если истинен элемент в скобках (поскольку скобки - метасимвол командного интерпретатора, их надо экранировать). Скобки используются для группировки элементов.
! элемент
Истинно, если элемент не истинен.
элемент [-a] элемент
Истинно, если истинны оба элемента. Если элементы просто перечислены подряд, предполагается эта же логическая операция И.
элемент -o элемент
Истинно, если истинен хотя бы один элемент.
Имена найденных (удовлетворяющих критерию, задаваемому выражением) файлов по умолчанию выдаются в стандартный выходной поток.
В качестве элементов выражения используются основные конструкции, представленные в табл. 12. Выражение проверяется слева направо , с учетом скобок.
Таблица 12 . Основные элементы выражения в команде find
Элемент
Назначение или критерий истинности
-name шаблон
Истинен, если имя файла соответствует шаблону. При использовании метасимволов необходимо маскировать шаблоны от командного интерпретатора.
-type тип
Истинен, если файл - указанного типа. Типы файлов задаются символами b , c , d , f , l , p и s , обозначающими, соответственно, специальное блочное устройство, специальное символьное устройство, каталог, обычный файл, символьную связь, именованный канал и сокет.
-user пользователь
Истинен, если файл принадлежит пользователю , указанному по идентификатору или регистрационному имени.
-group группа
Истинен, если файл принадлежит группе , указанной по идентификатору или имени.
-perm [-]права
Если дефис не задан, то истинен только если права доступа в точности соответствуют указанным (как в команде chmod , проще - абсолютные). Если задан дефис, истинен, если в правах доступа файла, как минимум, установлены те же биты, что и в указанных правах.
-size n[c]
Истинен, если файл имеет длину n блоков (блок - 512 байтов) или символов (если указан суффикс c ). Перед размером можно указывать префикс + (не меньше), - (не больше) или = (в точности равен).
-atime n
Истинен, если к файл последний раз обращались n дней назад. Перед n в элементах -atime , -ctime и -mtime можно указывать префикс + (не позже), - (не ранее) или = (ровно).
-ctime n
Истинен, если файл создан n дней назад.
-mtime n
Истинен, если файл был изменен n дней назад.
-newer файл
Истинен, если файл - более новый, чем указанный.
-ls
Всегда истинен. Выдает информацию о файле, аналогичную длинному листингу.
-print
Истинен всегда. Выдает полное имя файла в стандартный выходной поток.
-exec команда {} \;
Истинен, если выполненная команда возвращает код возврата 0. Команда заканчивается замаскированной точкой с запятой. В команде можно использовать конструкцию {} , заменяемую полным именем рассматриваемого файла.
-ok команда {} \;
Аналогичен exec , но полученная после подстановки имени файла вместо {} команда выдается с вопросительным знаком и выполняется только если пользователь ввел символ y .
-depth
Истинен всегда. Требует так обходить иерархию каталогов, чтобы файлы любого каталога всегда обрабатывались раньше, чем сам каталог (обход "в глубину").
-prune
Истинен всегда. Требует не проверять файлы в каталоге, сопоставившемся с предыдущим элементом выражения. Не действует, если ранее указан элемент -depth .
В различных версиях ОС UNIX могут поддерживаться и другие компоненты выражений в команде find . Если командная строка сформирована неправильно, команда немедленно завершает работу.
Рассмотрим несколько примеров использования команды find :
[kravchuk@arturo 15:05:25 /tmp]$ find . -user kravchuk -size +0c -ls
find: cannot read dir ./smc898: Permission denied
475898122 4 -rw-r--r-- 1 kravchuk 50 666 Mar 26 16:58 ./-1
473866040 4 -rw-r--r-- 1 kravchuk 50 6 Mar 26 17:55 ./1.txt
475472259 4 dr-xr--r-- 2 kravchuk 50 108 Mar 26 17:39 ./d1
474199552 4 -rw-r--r-- 1 kravchuk 50 639 Mar 26 16:55
./d1/f3.txt
476732956 4 -rw-r--r-- 1 kravchuk 50 6 Mar 26 17:55 ./2.txt
476732980 4 -rw-r--r-- 1 kravchuk 50 12 Mar 26 17:56 ./3.txt
476142563 4 -rw-r--r-- 1 kravchuk 50 7 Mar 26 17:56 ./4.txt
[kravchuk@arturo 15:26:41 /tmp]$ find . -name "??.txt" -print
find: cannot read dir ./smc898: Permission denied
./d1/f3.txt
./f1.txt
[kravchuk@arturo 15:26:58 /tmp]$ find . -name d1 -prune -name "??.txt" -print
find: cannot read dir ./smc898: Permission denied
[kravchuk@arturo 15:27:09 /tmp]$ find . -name d1 -prune -o -name "??.txt" -print
find: cannot read dir ./smc898: Permission denied
./f1.txt
[kravchuk@arturo 15:27:13 /tmp]$ find . -user kravchuk -ok rm {} \;
find: cannot read dir ./smc898: Permission denied
< rm ... ./p1 >? y
< rm ... ./-1 >? y
< rm ... ./1.txt >? y
< rm ... ./mpDfa4ZT >? y
< rm ... ./d1 >? y
rm: Unable to remove directory ./d1: File exists
< rm ... ./d1/f3.txt >? y
< rm ... ./2.txt >? y
< rm ... ./3.txt >? y
< rm ... ./4.txt >? y
< rm ... ./f1.txt >? y
[kravchuk@arturo 15:28:35 /tmp]$ find . -user kravchuk -print
find: cannot read dir ./smc898: Permission denied
./d1
./d1/f3.txt
Использование общепринятых имен основных файлов и структуры каталогов существенно облегчает работу в операционной системе, ее администрирование и повышает переносимость. Типичная структура и назначение каталогов файловой системы UNIX представлена в табл. 13.
Таблица 13 . Основные каталоги логической файловой системы UNIX
Каталог
Назначение и содержание
/
Корневой каталог. Является основой любой файловой системы UNIX. Все остальные каталоги и файлы располагаются в рамках структуры, порожденной корневым каталогом (в нем и в его подкаталогах), независимо от их физического местонахождения. Для корневого каталога обязательно должна создаваться отдельная физическая файловая система, а сам он является точкой ее монтирования , о чем свидетельствует наличие подкаталога lost+found .
/bin
Пользовательские выполняемые программы. Сейчас обычно является символической связью, указывающей на /usr/bin .
/dev
Каталог для специальных файлов устройств. Может иметь подкаталоги для различных классов и типов устройств, например, dsk , rdsk , rmt , inet (в SVR4).
/etc
Каталог для конфигурационных файлов. Может иметь подкаталоги для различных компонентов и служб. Конфигурационные файлы в UNIX - обычные текстовые.
/home
Каталог для размещения начальных каталогов пользователей. Часто является точкой монтирования отдельной физической файловой системы.
/lib
Каталог для библиотек. Сейчас обычно является символической связью, указывающей на /usr/lib .
/lost+found
Подкаталог, имеющийся в каждом каталоге, являющемся точкой монтирования физической файловой системы на диске. Корневой каталог всегда представлен отдельной физической файловой системой, должен быть всегда доступен, и монтируется автоматически при запуске системы. Все остальные физические файловые системы формально не нужны для функционирования ОС UNIX.
/mnt
Точка монтирования для файловых систем на съемных носителях или дополнительных дисках. Может содержать подкаталоги для отдельных типов носителей, например, cdrom или floppy . Может юыть пустым.
/opt
Каталог для дополнительного коммерческого программного обеспечения. Может быть пустым или отсутствовать (в BSD-системах).
/proc
Каталог псевдо-файловой системы, представляющей в виде каталогов и файлов информацию о ядре, памяти и процессах, работающих в системе.
/sbin
Каталог для системных выполняемых программ, необходимых для решения задач системного администрирования.
/tmp
Каталог для временных файлов. Имеет установленный клейкий бит и доступен для записи и чтения всем пользователям. Обычно создается в виде отдельной физической файловой системы, в том числе, в виртуальной памяти.
/usr
В этом каталоге находятся выполняемые программы, библиотеки, заголовочные файлы, справочные руководства (/usr/share/man ), исходные тексты ядра и утилит системы (Linux), растущие файлы и очереди печати (/usr/spool в BSD-системах) и т.д. Часто каталог является точкой монтирования отдельной физической файловой системы. Ниже представлены основные его подкаталоги.
/usr/bin
Основные выполняемые программы и утилиты.
/usr/include
Заголовочные файлы библиотек. Может содержать подкаталоги.
/usr/lib
Статически и динамически компонуемые библиотеки. Может содержать подкаталоги.
/usr/local
Каталог для дополнительного свободно распространяемого программного обеспечения (GNU ). Содержит структуру подкаталогов, аналогичную корневому каталогу (bin , etc , include , lib и т.д.).
/var
В UNIX System V и Linux этот каталог является заменителем каталога (/usr/spool ), используемого для хранения растущих файлов различных сервисных подсистем, например, файлов журналов системы. Так, основной журнал системы, ведущийся демоном syslogd , размещается в виде нескольких файлов в подкаталоге /var/adm . Там же, в файле /var/adm/messages , сохраняются сообщения времени загрузки. Имеет смысл создавать отдельную физическую файловую систему для размещения этого каталога (и, возможно, его подкаталога /var/run ).
Наличие, назначение и использование других каталогов верхнего уровня и подкаталогов зависит от версии ОС UNIX, установленного системного и прикладного программного обеспечения и конфигурации системы, созданной администратором.