Сегодня хочется задеть одну очень скользкую тему: права (и обязанности) на файлы в системах, основанных на Unix.
Как всегда, хочется рассказать интересно и не упустить важные моменты. Но многим это просто не надо. Им нужен очередной stackoverflow с ответами, в которые не надо вдумываться… Вжух-вжух и ты ботнет.
Поэтому вот рецепты (tl;dr), а объяснение будет ниже.
Чтобы сменить владельца файлов в директории и во всех поддиректориях (рекурсивно), выполните:
sudo chown -R user:group /home/user/path/to/directory/
Например, чтобы apache смог в какой-то папке сохранять файлы, выполняем:
sudo chown -R www-data:www-data /home/user/www/site/upload/
Чтобы дать права на чтение файла для всех, выполните:
chmod o+r /var/www/index.html
Чтобы сделать это для всей папки и подпапок (рекурсивно):
chmod -R o+r /var/www/index.html
Чтобы для всех файлов в папке (рекурсивно) выставить права «владелец может читать и менять, остальные — только читать»:
find /var/www/html-site -type f -exec chmod 644 {} ;
Чтобы для папки и подпапок (рекурсивно) выставить права «владелец может просматривать содержимое и создавать файлы и папки, остальные — только просматривать»:
find /var/www/html-site -type d -exec chmod 755 {} ;
Чтобы проверить, что у пользователя есть права, самое простое — зайти под ним:
sudo su user_name
— прочитать файл / создать файл прямо под этим пользователем.
Ну и самое интересное, что я нашёл в популярных вопросах:
$ sudo chown -R user:group /data/ chown: неверный пользователь: «user:group»
— замените user на имя пользователя (не «Иван Иванович Иванов», а «ivanov»), а «:group» можно не указывать.
А на самом деле…
Файлы в Unix
Начнём с того, что файлы в Unix бывают разные. Идеология «всё есть файл» предполагает, что файлы — не то, чем кажутся.
- Обычный файл — как раз всё то, что мы называем файлом.
- Директория — она же «папка», она же «каталог».
- Символическая ссылка — этакий ярлык на другой «файл».
- Блочное устройство — те же жёсткие диски, флешки.
- Символьное устройство — например, терминалы tty.
- Канал (fifo) — один из вариантов межпроцессорного взаимодействия.
- Unix сокет — ещё один из вариантов межпроцессорного взаимодействия.
Так что даже с понятием «файл» не так уж и просто. Зато есть возможность на всех них единообразно раздавать права, пользоваться ими. Например, можно сделать cat на устройство, echo для записи в сеть и т. д.
Во FreeBSD я успешно делал cat на директорию, правда получал не особо читаемую информацию. Но и её можно было использовать для получения нужной информации о файле типа «каталог».
В особо весёлых Unix-ах, например Plan9 можно использовать вместо интерфейса сокетов файлы типа /net/tcp. В общем, как всегда идеология «всё есть что-то» не имеет границ здравого смысла. И это прекрасно!
Права в Unix
Здесь мы рассмотрим базовую модель прав в Unix (модель дискреционного управления доступом), без всяких расширений типа атрибутов файлов, эффективных прав и прочих липких битов.
Суть модели прав довольно проста:
- У каждого файла есть владелец. Владелец устанавливает права доступа на свои файлы (например, командой chmod).
- В системе есть супер-пользователь (root), который устанавливает владельцев файлов (например, командой chown).
Теперь подробнее по первому пункту.
Доступ по пользователям делится на 3 группы
- Владелец (user) — тот самый, что имеет возможность изменять права доступа.
- Группа (group) — какая-то группа пользователей, которая должна иметь определённые права на файл. Посмотреть группы пользователя можно командой
$ groups gosha gosha : gosha adm cdrom sudo dip plugdev lpadmin sambashare libvirtd
— пользователь gosha состоит в группах:
gosha adm cdrom sudo dip plugdev lpadmin sambashare libvirtd
.С другой стороны можно посмотреть всех пользователей, состоящих в группе:
$ grep cdrom /etc/group cdrom:x:24:gosha
Не самый элегантный способ, но работает на всех Unix. Также можно использовать утилиты
lid
иmembers
. - Все другие (other) — любой пользователь, существующий в системе.
Сами права доступа также делятся на 3 группы
- Права на чтения (read или «4» в битовой маске) — право читать файл или читать содержимое директории.
- Права на запись (write или «2» в битовой маске) — право писать в файл или создавать файлы в директории.
- Право на исполнение (execute или «1» в битовой маске) — право запускать файл (программу, записанную в файле) или переходить по директории вглубь (например, сделать cd в поддиреторию).
Битовая маска прав доступа
Давайте посмотрим права на папку /bin, например, с помощью команды ls -l / | grep bin
:
drwxr-xr-x 2 root root 4096 май 6 03:24 bin |||||||||| |||||||||+-исполнение для всех остальных - разрешено ||||||||+--запись для всех остальных - НЕ разрешено |||||||+---чтение для всех остальных - разрешено ||||||+----исполнение для группы владельца - разрешено |||||+-----запись для группы владельца - НЕ разрешено ||||+------чтение для группы владельца - разрешено |||+-------исполнение для владельца - разрешено ||+--------запись для владельца - разрешено |+---------чтение для владельца - разрешено +----------тип файла - диретория
Кроме указанного представления полномочий доступа (символьного), существует так же и числовое представление. Для общего понимания, приведу таблицу соответствия числового (двоичного и десятичного) значения прав доступа и буквенного:
владелец | группа | остальные | |
буквенное | rwx | r-x | r-x |
числовое (десятичное) | 421 | 401 | 401 |
итоговое (сумма) | 7 | 5 | 5 |
В приведенной таблице показано, что право чтения, соответствует значению 4, право записи — 2, право выполнения — 1, отсутствие права — 0, складывая данные показатели, можно представлять и назначать права в числовом виде. Таким образом, вместо drwxr-xr-x
можно написать 755
. Часто можно увидеть именно числовое определение прав доступа — теперь вы понимаете, что это значит.
Часто можно увидеть на файле права 644 — постарайтесь понять, что это значит, чтобы закрепить полученные знания.
Содержание
- 1 Владение файлом.
- 2 Чтение прав доступа
- 3 Изменение владельца файла и прав доступа.
- 3.1 Числовой способ назначения режима доступа:
- 3.2 Символическое изменение режимов
Владение файлом.
Вот так, потихоньку, мы и подошли к понимаю модели владения файлами в операционной системе FreeBSD. Да и не только FreeBSD, всем операционным системам семейства UNIX присуща одна и та же структура принадлежности. Файл может принадлежать как пользователю, так и группе.
Чтение прав доступа
Для того, чтобы увидеть детали полномочий и владений для набора файлов воспользуемся командой ls с ключом -la (-l – ключ, дающий подробный листинг, -a для того, чтобы отобразить “скрытые” файлы, имена которых начинаются с точки).
Первая мысль после увиденного: “Что это?”. Хотя всё намного проще, чем кажется. Строка типа -rw-r–r– обозначает режим файла. Существует три модели прав владения файлом (каталогом): пользователь (user), группа (group) и другие (others). И три модели доступа: чтение (read), запись (write) и выполнение (execute).
Все эти позиции символов – это биты. По номерам.
- d, -. Означает “директория” и “файл” соответственно.
- r, -. Означает, может ли объект быть прочитан своим владельцем.
- w, -. Означает, может ли объект модифицироваться владельцем.
- x, -, s. Означает, может ли владелец выполнять этот файл, или (если “s”) может ли элемент выполняться в режиме setuid (об этом ниже).
- r, -. Может ли элемент быть прочитан членами той же группы, что и владелец.
- w, -. Может ли элемент быть модифицирован группой владельца.
- x, -, s. Может ли элемент выполняться группой владельца, либо выполняться в режиме setuid.
- r, -. Может ли элемент быть прочитан другим пользователем, отличным от владельца.
- w, -. Может ли элемент быть модифицирован другим пользователем, отличным от владельца.
- x, -, t. Может ли любой пользователь выполнять этот элемент, либо, (если “t”) элемент является “не поддающимся командам” (“sticky”) каталогом, в котором пользователь не может удалять файлы, если он им не владеет.
Таким образом комбинация:
drw-r–r– означает: директория, владелец может как читать, так и модифицировать, члены его группы могут только читать, любые другие пользователи могут только читать.
-rwxrwxrwx означает, что этот файл могут и читать и модифицировать абсолютно любые пользователи. И т.д.
Удобней всего представлять список прав в таком виде:
[d] [rwx], [rwx], [rwx], т.е. первый бит отдельно, а далее тройками для пользователя, группы и остальных соответственно.
Ну есть также общие правила:
Файл, который может быть удалён – можно и переименовать.
Файл, который можно прочитать – можно и скопировать.
Изменение владельца файла и прав доступа.
Будучи суперпользователем, мы можем отдавать свои файлы другим пользователям, либо менять владельца файла по своему усмотрению. Для этого служит команда chown (“change own”):
# chown user file1.txt
установит владельцем file1.txt пользователя user, но не сменит группу. Точно так же можно воспользоваться этой командой, чтобы сменить владельца у каталога:
# chown -R user /home/user
Минуточку. А что это за ключ -R? Мы о нём не говорили! Исправляюсь. Ключ -R означает рекурсивную обработку и применяется для каталогов. То есть для каждого файла в каталоге, для каждого подкаталога в каталоге и для файлов в них. И так далее. В общем применит команду для всех элементов внутри директории. Очень полезно :).
Аналогичным образом действует команда chgrp (“change group”):
# chgrp users file1.txt
изменит группу владельца на users. По умолчанию, FreeBSD создает для каждого пользователя персональную (первичную) группу с именем пользователя. Например пользователь “ivan” будет состоять в группу “ivan” и т.д.
И наконец – смена полномочий доступа. Команда chmod (“change mode”). Эта хитрая команда может работать двумя способами – численном и символическом. Какой удобней – решать вам, но знать лучше всего оба.
Числовой способ назначения режима доступа:
Самый простой способ – установить трёхразрядное восьмиричное число, которое уникально определяет полномочия для каждого типа владения. Каждый разряд относится к определённому режиму владения, соответственно для пользователя, группы и остальных. А биты таковы:
- 0 – нет полномочий;
- 1 – выполнение (поиск);
- 2 – запись;
- 4 – чтение;
Комбинация вычисляется соответственно суммой этих бит. Например 755 будет значить то же самое, что rwxr-xr-x. 777 – соответственно rwxrwxrwx, 644 – rw-r–r–и т.д. Схема понятна, надеюсь.
Таким образом может быть доступно только 3 из 4 разрядов. Четвёртый, “самый старший” разряд управляет дополнительными функциями. Биты сейчас и рассмотрим:
- 0. Обычные полномочия;
- 1. “sticky”-бит. Может быть установлен только для каталогов, превращая их в каталоги “только для добавления”, в которые файлы можно добавлять, но не удалять.
- 2. “setgid”, если этот бит установлен для исполняемого файла, то файл будет выполняться с групповыми полномочиями группы-владельца файла, а не того пользователя, кто запустил файл. Этот бит можно выставить только от имени суперпользователя.
- 4. “setuid”. Аналогично, если выставлен этот бит для исполняемого файла, то файл будет выполняться от имени владельца, независимо от того, кто запустил файл.
Таким образом назначение прав
# chmod 755 file.txt
на самом деле означает
# chmod 0755 file.txt, но старший бит можно опускать.
Символическое изменение режимов
Доступен второй способ, с указанием алфавитных флагов. Основные литеры:
- u (пользователь),
- g (группа),
- o (другие),
- a (все).
Права доступа:
- r (чтение),
- w (запись),
- x (исполнение),
- t (“липкий” бит),
- s (setuid, setgid биты).
Операции:
- + (добавление),
- – (отъем),
- = (установка)
Примеры здесь:
- g+w – добавляет полномочия на запись группе владельцу;
- +x – добавляет полномочия на исполнение для всех;
- o-r – отменяет полномочие на чтение остальным пользователям;
- ugo=rw – устанавливает для всех полномочия чтения-записи;
- a=rw – аналогично предыдущему;
Какой способ удобней – решать каждому. Но теперь мы знаем оба!
сhmod — установка, изменение прав доступа для файлов и директорий
chmod [-fhv] [-R [-H | -L | -P]] права доступа файл ...
Утилита chmod изменяет биты прав доступа для файлов и директорий, перечисленных в командной строке, в опции права доступа.
Поддерживаются следующие опции:
- -f
- Не отображать диагностическую информацию, в случае невозможности изменения прав доступа файла, не менять код завершения с целью просигнализировать о неудачном завершении операции.
- -H
- Если указана опция -R, следовать по символическим ссылкам в командной строке. ( По-умолчанию символические ссылки, встреченные при обходе дерева каталогов не обходятся )
- -h
- Если файл является символической ссылкой, менять права доступа на саму ссылку, а не на файл, на который она указывает.
- -L
- Если присутствует опция -R следовать по символическим ссылкам.
- -P
- Если опция -R присутствует, не следовать по символическим ссылкам ( поведение по-умолчанию ).
- -R
- Рекурсивно изменить права доступа на все дерево файлов и директорий, находящихся ниже указанного в опции файл.
- -v
- Вывод отладочной информации. Показывает имена файлов на которые были изменены права доступа. Если опция указано больше одного раза, например -vv, chown покажет имя файла а также старые и новые права доступа в цифровом и символическом представлении.
Опции -H, -L и -P будут проигнорированы, если не указана опция -R. Кроме того, данные опции переопределяют друг друга, использована будет та, которая указана последней.
Изменить права доступа может только владелец файла или директории и суперпользователь.
При успешном выполнении операции chmod возвращает 0 и >0 в противном случае.
Права доступа:
Права доступа могут быть представлены абсолютными или символическими значениями. Абсолютное значение является восьмеричным номером, получаемым из суммы следующих значений:
- 4000 ( setuid бит ).
- Исполняемый файл с установленным битом setuid, будет запущен с еффективным userid владельца файла.
При установке setuid бита на директорию, все файлы и поддиректории создаваемые в данной директории будут иметь владельца данной директории, а не владельца процесса, создавшего файл или директорию. При условии что текущая файловая система поддерживает такой функционал. Смотрите chmod(2) и опцию suiddir команды mount(8). - 2000 ( setgid бит).
- Исполняемый файл будет запущен с groupid владельца файла.
- 1000 ( sticky бит ).
- Смотрите chmod(2) и sticky(8)
- 0400
- Разрешить чтение владельцу.
- 0200
- Разрешает запись владельцу.
- 0100
- Для файлов, разрешает запуск владельцу файла, для директорий, разрешает поиск владельцу директории.
- 0040
- Разрешить чтение членам группы.
- 0020
- Разрешить запись членам группы.
- 0010
- Для файлов, разрешает запуск членам группы, для директорий, разрешает поиск членам группы.
- 0004
- Разрешает чтение остальным.
- 0002
- Разрешает запись для остальных.
- 0001
- Для файлов, разрешает запуск остальным, для директории разрешает поиск.
Например, обсолютное значение прав доступа, разрешающих: чтение, запись и выполнение владельцу, чтение и выполнение для членов группы, чтение и выполнение для остальных и без установленных битов SUID и SGID, будутиметь такое значение: 755 (400+200+100+040+010+004+001).
Символическое выражение прав доступа имеет следующую грамматику:
mode ::= clause [, clause ...] clause ::= [who ...] [action ...] action action ::= op [perm ...] who ::= a | u | g | o op ::= + | - | = perm ::= r | s | t | w | x | X | u | g | o
Символы для who, «u«, «g» и «o«, соответствуют значениям «пользователь«, «группа» и «остальные«. Символ «а» является эквивалентом «ugo«.
Символы perm соответствуют следующим значениям:
r Бит прав на чтение. s Бит SUID и SGID на выполнение. t Sticky бит. w Бит прав на чтение. x The execute/search bits. X Бит выполнения/поиска, если файл является директорией или если данные быты установлены в оригинальных правах доступа. Операции с символом X имеют значение только совместно с op равным "+" и будет проигнорирован в любом другом случае. u Бит прав для пользователя. g Бит прав для членов группы. o Бит прав для остальных.
Символы op ( операции )
+ Если значение perm не установлено, ничего не делать. Если не установлено значение для who, будут установлены значения perm для которых не установлены биты в маске создания файлов ( см. umask(2) ).
— Поведение аналогичное «+» только наоборот.
= Если опция who и опция perm не указаны, будут очищены биты прав доступа для пользователя, группы и остальных. Если в perm установлены какие-то биты, они будут присвоены согласно umask. Проще показать)
freebsd88 /# chmod -vv = ./testfile /testfile: 0100777 [-rwxrwxrwx ] -> 0100000 [---------- ] # Все биты били сброшены freebsd88 /# chmod -vv =r ./testfile /testfile: 0100000 [---------- ] -> 0100444 [-r--r--r-- ] # Установить биты прав на чтение для всех. freebsd88 /# chmod -vv =rwx ./testfile /testfile: 0100200 [--w------- ] -> 0100755 [-rwxr-xr-x ] # В этом случае права доступа устанавливаются согласно umask. freebsd88 /# chmod -vv u= ./testfile /testfile: 0100755 [-rwxr-xr-x ] -> 0100055 [----r-xr-x ] # Сбрасываем все права для пользователя. freebsd88 /# chmod -vv g=rwx ./testfile /testfile: 0100000 [---------- ] -> 0100070 [----rwx--- ] # Устанавливаем все права для группы.
Классические примеры:
644 Права доступа на чтение для всех и на запись только для владельца. go-w Запретить права на запись для группы и остальных. =rw,+X Установить права на чтение и запись в значения по умолчанию, но сохранить права на исполнение в текущей установке. +X Установить права доступа поиск/выполнение для файла или дректории для всех. 755 Сделать файл читаемым/исполняемым для всех и дать права на запись только для владельца. u=rwx,go=rx u=rwx,go=u-w go= Сбросить все биты прав доступа для группы и остальных. g=u-w Установить биты прав для группы какие установлены для владельца, но снять бит на запись.
СМОТРИТЕ ТАКЖЕ
chflags(1), install(1), setfacl(1), chmod(2), stat(2), umask(2), fts(3), setmode(3), symlink(7), chown(8), mount(8), sticky(8)
администрирование серверов
Изменить владельца и права доступа на файлы и папки в Linux и *BSD системах
Представленная ниже информация будет полезная начинающим Linux и *BSD системным администраторам. По большому счету, в любой операционной системе, будь то Linux, Windows или FreeBSD, корректная работа приложений, сервисов и безопасность системы в целом напрямую зависит от прав доступа на файлы и папки. Используя ниже приведённые средства, можно решить практически 90% проблем, возникающих при настройке прав доступа.
Сменить владельца для всех папок и файлов. Для этих целей в Unix используется команда chown. Она обладает рядом параметров:
- Опции. Например, для того, чтобы изменения коснулись не только данной директории, но и всех поддиректорий, нужно применить команду рекурсивно, т.е. с параметром «-R».
- Владелец или группа владельцев («user:group» или «user»).
- Пути до папок / файлов, к которым нужно применить команду. Например, «/mnt/pool1/dts1/backup».
Таким образом, команда для смены смены владельца (и группы владельцев) для директорий и всех вложенных папок и фалов будет выглядеть так:
sudo chown -R user:group /home/user/dir/
Изменить права доступа на файл или папку в Linux и *BDS системах можно командой chmod. Стоит отметить, что в Unix имеются свои особенности в работе данной команды и принципа разделения прав. Так, кроме владельца файла или папки, можно настроить, какие операции может выполнять этот самый владелец и группа, а также все остальные пользователи. В Unix идёт разделение возможностей следующим способом — владелец, группа владельцев и другие. Также присутствует следующее разделение прав:
- Право на запуск файла (для папок — проход по директории).
- Право на изменение файла (создание и удаление файлов и папок в директории)
- Право на чтение файла (для папок — это право на просмотр содержимого директории)
Для удобства использования и запоминания, используется следующая кодировка:
- запуск — 1
- изменение — 2
- чтение — 4
Складывая данные цифровые обозначения мы получим набор прав, предоставляемый владельцу/группе/другим. Разберем данную информацию на примере:
Изменять файл имеет право только владелец, группа владельцев может читать, остальные — ничего не могут, соответственно команда будет такой:
chmod 640 /media/fileshare/file.txt
Создавать файлы в папке могут все, но видит их только владелец:
chmod 622 /media/fileshare/messages/
Чтобы все могли запускать какую-либо программу, но никто, кроме владельца, не мог её редактировать:
chmod 711 /media/share/exec
Для изменения прав на все вложенные файлы и папки (т.е. рекурсивно) используется опять же ключ «-R».
Выполняя данные операции, стоит понимать — изменять права на файлы и директории могут только администраторы и владелец этих папок и файлов.
Изменение прав только на файлы или только на папки — команда find. При этом файлы обозначаются как file (f), а директории, соответственно — d. Например:
chmod -R 775 $(find . -type d)
nas4free — программное обеспечение на основе FreeBSD. Поэтому вся основа — файлы, папки, права доступа — как в этой оси. (И вся это основа — очень близка к Linux, хотя и не полностью совпадает). Я попытаюсь предельно кратко и поверхностно описать эти самые права. Более полное и корректное описание см «Руководство FreeBSD» Права доступа. В соседних главах, кстати, тоже есть что почитать долгими зимними вечерами
С правами доступа к файлам на NAS вы обычно сталкиваетесь, когда при попытке удалить файл на Windows шаре, а система не даёт. Если посмотреть на такой файл в файловом менеджере nas4free (как пример — files.db на картинке), то
в столбце справа видим запись -rw-r—r—. А у папки — drwxr-xr-x. Можно догадаться, что первая буква позволяет отличить папку (от слова directory) от файла. Так и есть. Бывают и другие значения, например l — (от link) софтлинк, ссылка на файл, примерно как ярлык в Windows.
Остальные 9 букв — три тройки. Первая тройка флагов — права для пользователя-владельца файла. Вторая — для тех, кто состоит в той же группе, что и основная группа владельца и третья — для всех прочих. В нашем примере для файла files.db владелец может его читать ( r — read), писать в него (включая изменять содержимое и удалять; w — write) и исполнять как программу (x — eXecute). Для папки флаг x имеет немного другое значение. Если не вдаваться в детали — для нормального чтения папки должны быть подняты флаги r и x.
Как менять права?
NB хорошая практика — давать доступ тем пользователям и туда, куда им положено. Она обязательна на работе. Да и дома позволяет ограничить доступ членам семьи туда, где они что-то могут по незнанию поломать. Так что если вы можете внедрить и использовать такую практику дома — так и делайте. А описываемая ниже практика с полным доступам ко всем данным годится только для важного частного случая домашней доверенной сети без доступа извне, в которой кроме вас никто файлы не пишет-стирает.
Для новичка наиболее простой способ сменть права одному-двум файлам — через файловый менеджер. Кликаем мышкой на строку прав файла (напр -rw-r—r—) — открывается диалог редактирования прав.
Но если хочется разом изменить права многим файлам в многих подпапках — то без командной строки не обойтись.
Команда ls c ключами la показывает полную информацию о файлах, включая права и владельцев
n4fodroid: ~# ls -la /mnt/Pool/Media/
total 116779
drwxrwxrwx 4 root wheel 6 Jan 6 01:07 .
drwxr-xr-x 6 vboxusers vboxusers 6 Jan 4 22:39 ..
drwxr-xr-x 2 ftp wheel 3 Jan 3 21:38 .wd_tv
drwxrwxrwx 5 ftp wheel 5 Dec 28 01:39 SyncThing
-rw-r--r-- 1 root wheel 12351 Jan 6 01:07 lortr.S01E06.MP4.torrent
-rwxrw-rw- 1 ftp wheel 119389144 Jan 4 23:14 pi2_11.xz
Команда chmod меняет права доступа
n4fodroid: ~# chmod 777 /mnt/Pool/Media/lortr.S01E06.MP4.torrent
n4fodroid: ~# ls -la /mnt/Pool/Media/
total 116779
drwxrwxrwx 4 root wheel 6 Jan 8 17:56 .
drwxr-xr-x 6 vboxusers vboxusers 6 Jan 4 22:39 ..
drwxr-xr-x 2 ftp wheel 3 Jan 3 21:38 .wd_tv
drwxrwxrwx 5 ftp wheel 5 Dec 28 01:39 SyncThing
-rwxrwxrwx 1 root wheel 12351 Jan 6 01:07 lortr.S01E06.MP4.torrent
-rwxrw-rw- 1 ftp wheel 119389144 Jan 4 23:14 pi2_11.xz
права 777 — это обозначение полных прав доступа — всем разрешено всё.
[Подробнее…]
Значение |
Права доступа |
Список файлов каталога |
---|---|---|
0 | Ничего не разрешено | --- |
1 | Нельзя читать и писать, разрешено исполнять | --x |
2 | Нельзя читать и исполнять, разрешено писать | -w- |
3 | Нельзя читать, разрешено писать и исполнять | -wx |
4 | Разрешено читать, нельзя писать и исполнять | r-- |
5 | Разрешено читать и исполнять, нельзя писать | r-x |
6 | Разрешено читать и писать, нельзя исполнять | rw- |
7 | Разрешено все | rwx |
Ключ -R применяет команду рекурсивно — к папке, на которую команда дана, ко всем подпапкам в этой папке, ко всем файлам в этих папках.
n4fodroid: ~# chmod -R 777 /mnt/Pool/Media/test
даст полный доступ ко всему содержимому папки /mnt/Pool/Media/test
Обращаться с ОСТОРОЖНОСТЬЮ. Например, команда chmod -R 777 /mnt/Pool/Media даст полный доступ к содержимому /mnt/Pool/Media — а это нежелательно. К примеру, у нас там был служебный файл .wd_tv
и сломать доступ к нему — нехорошо. Ещё хуже, если мы нарушим доступ к чему-то более сложному, чем данные — к клеткам (jail), папкам с исполняемыми кодами и пр. Скорее всего просто перестанет работать. И починить будет непросто.
Поэтому открывайте доступ только к тому, к чему вам действительно нужно.
PS А владельцев позволяет задавать команда chown.
Для тех, кто ищет быстрый способ парой командой массово поменять права доступа на файлы и папки:
cd /var/www/sheensay.ru find ./ -type f -exec chmod 0644 {} ; find ./ -type d -exec chmod 0755 {} ;
Если не в курсе, что это, подробности далее
-
Что такое Chmod
-
Зачем использовать Chmod
-
Синтаксис Chmod
-
Ключи -R, -v, -f
-
Правила доступа Chmod
-
Как проверить права Chmod
-
Пример правильного использования Chmod
-
После использования Chmod появились ошибки
Это UNIX-утилита, с помощью которой можно быстро через консоль изменить права на доступ для определённых владельцев (owner) и групп (group) для указанных категорий и файлов.
Зачем использовать Chmod
В UNIX-системах — FreeBSD, Ubuntu, Debian, Centos — у каждого файла и папки (каталога) есть свои владелец и группа, к которым они относятся. Сделано это с целью разграничения прав доступа на чтение (r, read), запись (w, write) и исполнение (x, execute) для разных пользователей: владельцев (u), пользователей, входящих в группу владельца (g) и остальных (o).
Например, если вы пользуетесь хостингом, то должны знать, что ваш сайт физически находится на одном сервере рядом со множеством других сайтов таких же, как вы, пользователей со своими сайтами. Чтобы вы не смогли помешать друг другу, у каждой директории с сайтами свой владелец и группа пользователей, к которым они относятся.
На shared хостинге о вас позаботятся профессиональные системные администраторы. А если вы имеете свой сервер VDS/VPS, то просто обязаны следить за прописанными правами на доступ к файлам. Например, если вдруг с помощью уязвимости на сайте злоумышленник сможет записать backdoor в директорию для загрузки файлов, то с правильно прописанными правами доступа он не сможет причинить большого вреда файловой системе. Конечно, в директории для загрузки файлов должно быть принудительно отключено исполнение скриптов, но это тема уже для другого разговора.
Синтаксис Chmod
chmod [-Rvf] [Правила доступа] [Файл/Файлы/Каталог, директория файлов]
В части [Правила доступа]
могут быть либо числовые, либо символьные значения.
[Файл/Файлы/Каталог файлов]
— путь к файлу, файлам или к каталогу файлов, абсолютный или относительный.
Ключи -R, -v, -f
-R
Рекурсивное изменение прав доступа для каталога и вложенных файлов и подкаталогов-v
Подробное описание применения изменения прав доступа или невозможности этого действия-f
Не выдавать сообщение об ошибке для тех файлов и каталогов, для которых невозможно изменить права доступа
Правила доступа Chmod
Как вы уже знаете, права доступа определяются тем, как пользователь может взаимодействовать с файлами и каталогами, а именно r — read (чтение), w — write (запись), x — execute (выполнение).
А также, вы знаете, что эти права должны быть прописаны для трёх групп пользователей:
- Владелец файла или каталога;
- Пользователи, входящие в группу владельца;
- Остальные.
Теперь посмотрим в таблицу определения прав:
Три варианта записи прав пользователей
То есть, для того, чтобы записать правило для владельца дать доступ на чтение и запись, остальным дать права только на чтение, мы должны дать права (
rw-r--r--
)
Теперь обратите внимание на столбец Символьная
и Восьмеричная
. Там визуально показано, что то, что выглядит символьно как (rw-r--r--
), в восьмеричном виде выглядит как (644
). Это выражение и будем использовать как числовую запись в команде.
Теперь осталось собрать всё воедино в одну запись. Для примера, изменим права на доступ «всем дать права на чтение, владельцу право изменять содержимое» для файла index.php
:
chmod -v 644 index.php
Как одной командой массово изменить права всем файлам в текущем каталоге и подкаталогах
Как проверить права Chmod
ls -ld index.php
где index.php
— файл или каталог, который нужно проверить.
Пример правильного использования Chmod
Правила доступа по умолчанию для каталогов 755
, для файлов 644
. Поэтому, в подавляющем большинстве случаев, вам понадобятся только эти права.
Ниже пример того, как в каталоге /var/www/sheensay.ru
на все файлы рекурсивно поставить права 0644
, а на все каталоги и подкаталоги 0755
cd /var/www/sheensay.ru find ./ -type f -exec chmod 0644 {} ; find ./ -type d -exec chmod 0755 {} ;
Первой командой переходим в нужную директорию, далее с помощью команды find
ищем нужный тип: файлы -f
(files) и каталоги -d
(directories) — и запускаем chmod
с нужными правами.
После использования Chmod появились ошибки
Если после правильной настройки Chmod перестали открываться некоторые страницы сайта, открывается белый экран, не загружаются файлы на сайт, проверьте, правильно ли вы установили Chown для всех каталогов и файлов сайта, возможно, права доступа стоят слишком строгие. Либо или php, или Apache запускаются не от того пользователя.
Загрузка…
Прервать выполняющуюся команду:
^C (Ctrl-C)
Выйти из shell:
exit
Показать документацию к команде ls. Вместо ls можно подставить любую другую команду:
man ls
Описание структур каталогов:
man hier
Показать текущую дату и время:
date
Показать продолжительность того, сколько времеи включена система:
uptime
Показать кто залогинен:
w
Показать последние 10 входов:
last -10
Показать директорию, в которой сейчас находимся:
pwd
Перейти в директорию /usr/local/etc/:
cd /usr/local/etc/
Вместо /usr/local/etc/ можно указать любую другую директорию, в которую есть доступ.
Перейти в каталог на один уровень вверх:
cd ..
Перейти в свою домашнюю директорию:
cd ~
Перейти в корневую директорию:
cd /
Узнать размер папки:
du -hsx /путь/до/папки
Показать содержимое текущей директории:
ls
Показать подробно содержимое текущей директории (в выводе команды указаны даты, права на файлы/директории):
ls -l
Показать список всех файлов, включая скрытые файлы:
ls -a
Показать права доступа к файлу filename:
ls -l filename
Показать права доступа к директории directory:
ls -ld directory
Создать даректорию newdir в папке tmp:
mkdir /tmp/newdir/
Создаём директорию subdir, даже если у нас отсутствует папка newdir. Все папки создадутся автоматически:
mkdir -p /tmp/newdir/subdir/
Удалить директорию /tmp/newdir/ . Вместо /tmp/newdir/ можете указать нужную вам папку:
rmdir /tmp/newdir/
Удалить непускую директорию newdir. Вместо «newdir» у вас может быть другая папка:
rm -rd /tmp/newdir/
Список частовводимых комманд:
history | awk ‘{a[$2]++}END{for(i in a){print a[i] » » i}}’ | sort -rn | head
Колличество активных соединений tcp:
netstat -an|grep tcp | wc -l
Колличество активных соединений udp:
netstat -an|grep udp | wc -l
Прочитать несколько байт файла и определить тип файла:
file filename
Пример 1:
file /etc/rc.conf
/etc/rc.conf: ASCII English text
Пример 2:
file /bin/cp
/bin/cp: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), for FreeBSD 7.1, dynamically linked (uses shared libs), FreeBSD-style, stripped
Вывести на экран содержимое файла filename:
less filename
space(пробел) = следующая страница, b = предыдущая страница,
q = выйти, / = искать далее, ? = искать в предыдущем, n = повторить поиск.
Вывести на экран содержимое файла filename. -M = показывать название файла:
less -Mi filename
Показать количество строк в файле filename:
wc -l filename
Показать первые 5 строк файла filename (количество строк можно указать самостоятельно):
head -5 filename
Показать последние 5 строк файла filename (количество строк можно указать самостоятельно):
tail -5 filename
Показать последние 10 строк файла, подождать и показать новые линии по мере их добавления (^ C для выхода). Особенно полезено для лог-файлов:
tail -f filename
Создать файл filename, если он не существует или обновить время создания, если такой файлик имеется:
touch filename
Удалить файл filename:
rm filename
Копировать файл filename и присвоить ему новое имя — newname:
cp filename newname
Копировать файл или файлы в директорию /tmp/ ,название файлов и директорию укажите самостоятельно:
cp file1 file2 … /tmp/
Копировать директорию /tmp/ в директорию /home/ ,название директорий укажите самостоятельно:
cp -R /tmp/ /home/
Перенести файл oldname в туже директорию, где он находится, но под другим названием — newname. Проще говоря, переименовать файл oldname в newname:
mv oldname newname
Перенести файл или файлы в директорию /tmp/ , название файлов и директорию укажите самостоятельно:
mv file1 file2 … /tmp/
Сделать жёсткую ссылку newname на файл filename:
ln filename newname
Найти все файлы в директории /etc/ , или в любой другой указанной вами директории (/etc/ -для примера):
find /etc/ -type f
Найти все файлы в директории /etc/, начинающиеся с rc. Вместо /etc/ и rc укажите свои данные:
find /etc/ -type f -name ‘rc*’
Читать сжатый текстовый файл, без распаковки его на диск:
gzip -dc filename.gz | less
bzip2 -dc filename.bz2 | less
Показать содержимое сжатого архива:
tar -tzf filename.tgz или .tar.gz
tar -tjf filename.tbz2 или .tar.bz2
Извлеч содержимое архива filename.tgz в директорию /tmp/:
tar -xvzf filename.tgz -C /tmp/
Извлеч содержимое архива filename.tbz2 в директорию /tmp/:
tar -xvjf filename.tbz2 -C /tmp/
Извлеч содержимое архива filename.tgz в текущую директорию:
tar -xvzf filename.tgz
Извлеч содержимое архива filename.tbz2 в текущую директорию:
tar -xvjf filename.tbz2
Показать все процессы:
ps auxw
Показать все процессы «sshd»:
ps auxw | grep sshd
Постоянно показывать наиболее активные процессы (q — выход):
top
Отправить сигнал для остановки процесса, идентификатором которого является его pid:
kill pid
или
kill -TERM pid
Послать сигнал всем процессам, чье имя «httpd»:
killall httpd
Искать команду cp в PATH и показать, где она была найдена:
which cp
Показать 20 последних введённых команд:
history 20
Показать все переменные окружения:
printenv
Показать одну переменную окружения ‘PATH’:
printenv PATH
или
echo $PATH
Переменные среды можно установить в ~/.profile для sh, ~/.bash_profile для bash, или ~/.cshrc для csh
Показать текущие uid, gid и дополнительные groups:
id
Показать текущее имя пользователя:
whoami
Стать root’ом (пользователь должен быть в группе «wheel»):
su
Изменить uid на username:
su username
Показать все учётные записи (выводится содержимое файла /etc/passwd, где они перечислены):
cat /etc/passwd
Показать все группы (выводится содержимое файла /etc/group, где они перечислены):
cat /etc/group
Создать пользователя username; — m = создать домашную директорию:
pw useradd username -m
Изменить свой пароль:
passwd
Изменить пароль пользователя username (имеет право только root):
passwd username
Добавить пользователя username в группу «wheel» (или отредактируйте /etc/group):
pw usermod username -G wheel
Удалить пользователя username; -r = удалить домашную директорию:
pw userdel username -r
Показать все учётные записи с зашифрованными паролями:
cat /etc/master.passwd
Показать примонтированные файловые системы:
mount
Показать используемое и свободное место на всех примонтированных файловых системах (-h = для большей читабельности для людей, -m = если надо узнать размер в Мб):
df
df -h
df -m
Список процессов с открытыми файлами:
fstat
Показать файловую таблицу:
cat /etc/fstab
Показать слайсы устройства ad0:
fdisk /dev/ad0
Показать статистику дисковых операций ввода/вывода каждые 2 секунды:
iostat 2 gstat -I 2s
Показать список установленных пакетов:
pkg_info
Показать подробное описание пакета «zip» (вместо zip укажите любой установленный у вас пакет):
pkg_info zip*
Показать список файлов, включенных в пакет «zip»:
pkg_info -L zip*
Установить пакет foo-1.2.3.tbz:
pkg_add foo-1.2.3.tbz
Установить пакет foo из FTP сервера, используемого по умолчанию:
pkg_add -r foo
Установить пакет foo из альтернативного FTP сервера:
PACKAGEROOT=»ftp://ftp.freebsd. org» pkg_add -r foo
Удалить пакет foo-1.2.3:
pkg_delete foo-1.2.3
Выполнять после установки пакетов, для повторного сканирования PATH. (Необходимо только если используете csh):
rehash
Показать загруженные модули:
kldstat
Загрузить модуль:
kldload название_модуля
Выгрузить модуль:
kldunload название_модуля
Показать все сетевые интерфейсы:
ifconfig -a
Показать таблицу маршрутизации:
netstat -r -n
Добавить статический маршрут по умолчанию:
route add default 192.168.0.254
Отправить ping пакеты на адрес 1.2.3.4, проверка доступности хоста (^C для выхода):
ping 1.2.3.4
Отправка пакетов до адреса 1.2.3.4 и отображение промежуточных найденных маршрутизаторов:
traceroute -n 1.2.3.4
Показать все пакеты, переданные и принятые на интерфейсе em0:
tcpdump -i em0 -n -s1500 -X
Показать только заголовки tcp пакетов приходящих/уходящих на 80 порт:
tcpdump -i em0 -n tcp port 80
Открыть TCP соединение на порт 80 хоста с адресом 1.2.3.4:
telnet 1.2.3.4 80
Инициализация настроек сетевых интерфейсов в /etc/rc.conf:
/etc/rc.d/netif start
Инициализация настроек статических маршрутов из /etc/rc.conf:
/etc/rc.d/routing start
Настройка интерфейса с пометкой «DHCP» в /etc/rc.conf:
/etc/rc.d/dhclient start
Показать активные сетевые подключения:
netstat -finet -n
Показать процессы слушающие на IPv4 sockets:
sockstat -4 -l
Перезагрузить ОС:
reboot
Выключить ПК, немедленно
shutdown -p now
Права на файлы/папки:
права на файлы и папки обозначаются в виде цифр или букв:
4 = read (разрешение на чтение)
2 = write (разрешение на запись)
1 = execute (разрешение на выполнение)
Права представлены тремя цифрами:
первая цифра — разрешения для вас
вторая цифра — разрешения для группы
третяя цифра — разрешения для всех остальных
Сложение цифр можно добиться установления прав. Например:
3 (2+1) — разрешение на запись и выполнение файла (каталога);
5 (4+1) — разрешение на чтение и выполнение;
6 (4+2) — разрешение на чтение и запись;
7 (4+2+1) — разрешение на чтения, запись и выполнение
То есть существует всего семь вариантов:
7 = read, write & execute (чтение, запись, выполнение);
6 = read & write (чтение и запись);
5 = read & execute (чтение и выполнение);
4 = read (чтение);
3 = write & execute (запись и выполнение);
2 = write (запись);
1 = execute (выполнение).
Для установления прав доступа используется команда CHMOD.
На примере нагляднее:
chmod 777 /tmp/file.sh -разрешить читать, изменять, выполнять файл file.sh всем
chmod 766 /tmp/file.sh -разрешить себе читать, изменять, выполнять файл file.sh, а группе и всем остальным только читать, изменять.
Если надо дать права всем файлам в папке и всему содержимому включая подпапки(рекурсивно), надо использовать параметр -R, т.е.:
chmod -R 766 /tmp/
Узнать погоду из консоли (должен быть установлен curl, Вместо Moscow напишите свой город):
curl -s «http://www.google.com/ig/api?weather=Moscow» | sed ‘s|.*.*|1|’
Узнать количество установленной физической памяти:
cat /var/run/dmesg.boot | grep «real memory»
Узнать переменные окружения (PATH) в языке csh (по умолчанию во FreeBSD):
setenv | grep PATH
Перестартовать сеть (сетевое подключение по ssh сохранится)
/etc/rc.d/netif restart
Остановить сетевую карту:
ifconfig network-interface down
здесь network-interface — это интерфейс сетевой карты, который можно посмотреть командой ifconfig
Аналогично запуск сетевой карты:
ifconfig network-interface up
Получить список поднятых сетевых интерфейсов:
ifconfig -u
Получить список выключенных сетевых интерфейсов:
ifconfig -d
Посмотреть размер директории:
du -h
Перезапустить ipfw:
/etc/rc.d/ipfw restart
Информация об установленном CPU:
sysctl -a | egrep -i ‘hw.machine|hw.model|hw.ncpu’
Узнать все IP-адреса сайта:
host -t a mediaunix.com
Создать дамп базы mysql:
mysqldump -u ЛогинАдминаБД -pПарольАдминаБД -B ИмяБД > /путь/куда/сохранить/дамп/базы/ИмяБазы.sql
Настроить дату и время на freebsd:
date yymmddhhss
где
yy -сокращённо год (две последние цифры)
mm -месяц
dd -день
hh -час
ss -минуты
Синхронизировать дату и время с сервером:
ntpdate pool.ntp.org
Все команды и их комбинации перечислять излишне. Если есть, что нужно добавить, добро пожаловать в комментарии, добавлю.