Что такое исполняемость?
Уже много написано о том, как установить флаг исполняемости. Но что происходит с файлом во время этого, что такое исполянемость и как это работает?
Программа — это набор инструкций, которые по очереди выполняет процессор над данными, чтобы получить определенный результат. Но это вы, наверное, уже знаете.
На самом деле для процессора нет разницы между данными и инструкциями. И те и другие состоят из байт, проще говоря цифр. Когда-то договорились, что определенные сочетания цифр будут означать то или иное действие процессора, а во всем остальном это те же данные. Поэтому для процессора нет никакой разницы что выполнять — исполняемый файл linux или обычный текстовый файл. Оба могут быть успешно выполнены, вот только во втором варианте инструкции не имеют никакого смысла.
Чтобы система могла определить какие файлы нужно выполнять, а какие лучше не надо и был придуман флаг исполняемости. По сути, флаг исполяемости — это несколько байт в файловой системе, которые говорят нужно выполнять файл или нет, само содержимое файла никак не изменяется. Со скриптами все работает точно так же, только команды из файла выполняет не процессор, а интерпретатор, например, в bash скриптах — сама оболочка bash. Да и в обычных программ тоже есть свой загрузчик — это ld-linux.so.2.
Примеры использования команды chmod в абсолютном режиме
Разрешение чтения, записи, выполнения файла file всеми пользователями и группами (полный доступ):
Установка разрешений на чтение и запись для владельца, группы и остальных пользователей:
Установка полного доступа к файлу для владельца и лишь чтения для группы и остальных пользователей:
Установка полного доступа к файлу владельцу файла и запрет доступа группе и другим пользователям:
Установка разрешений на чтение и запись для владельца файла и лишь чтения для группы и остальных:
Установка разрешений на чтение и запись владельцу файлу и его группе и запрет доступа для других:
Установка доступа к файлу с разрешением чтения для всех пользователей и групп:
Права доступа к файлу для чтения, записи, выполнения владельцем и чтения, выполнения группе и другим:
Разрешение доступа к файлу на чтение и выполнение пользователю и остальным и запрет доступа для группы:
Если вы хотите назначить права доступа на все файлы в текущем каталоге, просто поставьте после назначаемых прав доступа знак * (звездочка):
В результате выполнения этой команды владелец получит полные права (чтение, изменение, выполнение) на все файлы текущего каталога, а группа и другие пользователи – только чтение и выполнение. Если вы хотите, чтобы ваши действия распространились рекурсивно (включая все подкаталоги), воспользуйтесь опцией -R:
Результатом выполнения вышеприведенной команды будет рекурсивный “обход” всех подкаталогов текущего каталога и назначение полного доступа для всех пользователей и групп. В этой статье рассмотрены лишь некоторые примеры применения команды chmod
Если вы хотите узнать подробнее о работе команды chmod и правах доступа в Linux, обратите внимание на эту статью
Разработанный ещё в 70-е годы прошлого века механизм распределения прав в операционных системах оказался настолько успешным, что используется в UNIX-системах до сих пор, то есть уже больше сорока лет.
Права и владельцы
- В операционной системе UNIX были сформулированы некоторые общие идеи и принципы, которые оказали в дальнейшем сильное влияние на её архитектуру, пользовательский интерфейс, культуру и развитие. В частности, один из основополагающих принципов выражается мантрой «всё есть файл», которую часто называют определяющим пунктом UNIX в целом.
- Суть данного принципа заключается в создании унифицированного способа доступа к широкому диапазону ресурсов ввода/вывода: к документам, каталогам, жёстким дискам, дискам CD-ROM, модемам, клавиатурам, принтерам, мониторам, терминалам и даже межпроцессным и сетевым взаимодействиям. Цель — предоставление универсальной абстракции для каждого из этих объектов, названных отцами-оснвоателями UNIX общим термином «файл». Поскольку доступ к файлу осуществляется с помощью одного и того же API, стало возможно использовать одинаковый набор базовых команд для чтения и записи таких разнородных устройств, как диск, клавиатура, документ или сетевой интерфейс.
- Абстракция файла, существующая в операционной системе UNIX и совместимых с ней системах, является основополагающей и всеобъемлющей. Любая системная служба и интерфейс устройства теперь могут реализовываться так, чтобы предоставлять другим приложениям метафору файла или файловой системы. Это открывает новые способы их использования и значительно расширяет возможности существующих приложений — простые инструменты, разработанные для решения узких задач, теперь, вооружившись абстракцией файла UNIX, могут использоваться совершенно по-новому. Небольшая утилита вроде cat, предназначенная для считываения одного или нескольких файлов и вывода их содержимого на стандартный поток вывода, теперь может выполнять чтение с устройств ввода-вывода с помощью специальных файлов устройств, как правило расположенных в каталоге . С другой стороны, во многих системах запись и проигрываение звука теперь выполняется всего лишь командами «» и «» соответственно.
В GNU/Linux каждый файл принадлежит какому-то пользователю и группе. Существует три типа прав доступа — чтение, запись и исполнение. Права доступа задаются по отдельности для владельца-пользователя, владельца-группы, и для прочих пользователей, которые не входят в первые две категории. Владельцев файла и права доступа можно узнать с помощью «длинного» формата команды :
$ ls -l /boot/
total 13740 drwxr-xr-x 2 root root 4096 Jan 12 00:33 grub -rw-r--r-- 1 root root 8570335 Jan 12 00:33 initramfs-linux-fallback.img -rw-r--r-- 1 root root 1821573 Jan 12 00:31 initramfs-linux.img -rw-r--r-- 1 root root 1457315 Jan 8 08:19 System.map26 -rw-r--r-- 1 root root 2209920 Jan 8 08:19 vmlinuz-linux
Первая колонка содержит права доступа к файлу (например, правами файла являются ). Третья и четвёртая колонки содержат соответственно пользователя и группу, которым принадлежит файл. В этом примере все файлы принадлежат пользователю root и группе root.
$ ls -l /media/
total 16 drwxrwx--- 1 root vboxsf 16384 Jan 29 11:02 sf_Shared
В этом примере каталог принадлежит пользователю root и группе vboxsf. Владельца и права доступа можно также определить утилитой stat.
Пользователь-владелец:
$ stat -c %U /media/sf_Shared/
root
Группа-владелец:
$ stat -c %G /media/sf_Shared/
vboxsf
Права доступа:
$ stat -c %A /media/sf_Shared/
drwxrwx---
Права доступа отображаются тремя группами символов, которые являются правами соответственно пользователя, группы и всех остальных. Например, строка говорит о том, что владелец файла имеет права на чтение и запись, но не на выполнение (), а пользователи из группы-владельца и прочие пользователи имеют доступ только на чтение ( и ). С другой стороны, строка говорит о том, что у пользователя и группы права на чтение, запись и исполнение ( и ), а все остальные доступа к файлу не имеют вовсе (). Первый символ в строке означает тип файла.
Вывести список всех файлов, принадлежащих пользователю или группе, можно с помощью утилиты :
# find / -group имя_группы
# find / -group номер_группы
# find / -user имя_пользователя
Изменить владельцев файла можно командой chown, а права доступа меняются командой chmod:
Chown
Давайте начнем с команды chown.
Используя ее, вы можете изменить владельца или группу объектов (другими словами, файлы, поскольку все в GNU / Linux представлено в этой форме).
Это влияет на установленные права доступа к ним.
Чтобы просмотреть владельца файла, введите:
ls -lh
Третье и четвертое поля показывают имя владельца и имя группы.
Обычно они совпадают, но бывают случаи, когда их необходимо разыменовать.
Чтобы сменить текущего владельца на нового, используйте команду:
chown root OBJECT
где OBJECT – имя файла (или нескольких разделенных пробелом).
Вы также можете указать флаг -R перед именем каталога, который нужно изменить, чтобы рекурсивно выполнить операцию, которая затрагивает все вложенные объекты.
Если терминал указывает, что для выполнения этого действия недостаточно прав, сначала добавьте sudo:
sudo chown root OBJECT
Чтобы изменить группу, укажите ее с помощью команды:
chown root:root OBJECT
или
chown :root OBJECT
чтобы изменить только группу:
Помимо флага рекурсивной операции существуют и другие (которые похожи на chmod).
Например, –from позволяет вносить изменения только для объектов с указанным владельцем и группой.
Имеет смысл использовать его вместе с рекурсией:
chown --from=anton:anton http:http -R OBJECT
Сохраняем корневую файловую систему
К корню (/) файловой системы Linux следует относиться с большим вниманием. Если вы допустите ошибку на этом уровне, последствия могут быть очень серьезными, вплоть до того, что система будет неработоспособна
Особенно это актуально, когда вы запускаете рекурсивную команду, которая вносит изменения или, что еще хуже, удаления. Аргумент —preserve-root команды chmod защитит корневую файловую систему. Если с аргументом используется рекурсивная команда chmod, ничего не произойдет, и вы увидите это сообщение:
Опция не действует без рекурсивного аргумента. Однако, если команду запустит пользователь root, будут изменены права для /, но не для других файлов или директорий.
Удивительно, но —no-preserve-root — это не аргумент по умолчанию. Если вы запустите команду без опции «сохранить», по умолчанию будет выбран режим «без сохранения» и, возможно, изменятся разрешения для файлов, которые не следует изменять.
Команда chmod Linux
Эта команда имеет типичный для команд linux синтаксис, сначала команда, затем опции, а в конце файл или папка, к которой ее нужно применить:
$ chmod опции права /путь/к/файлу
- r — чтение;
- w — запись;
- x — выполнение;
- s — выполнение от имени суперпользователя (дополнительный);
Также есть три категории пользователей, для которых вы можете установить эти права на файл linux:
- u — владелец файла;
- g — группа файла;
- o — все остальные пользователи;
Синтаксис настройки прав такой:
группа_пользователейдействиевид_прав
В качестве действий могут использоваться знаки «+» — включить или «-» — отключить. Рассмотрим несколько примеров:
- u+x — разрешить выполнение для владельца;
- ugo+x — разрешить выполнение для всех;
- ug+w — разрешить запись для владельца и группы;
- o-x — запретить выполнение для остальных пользователей;
- ugo+rwx — разрешить все для всех;
Но права можно записывать не только таким способом. Есть еще восьмеричный формат записи, он более сложен для понимания, но пишется короче и проще. Я не буду рассказывать как считать эти цифры, просто запомните какая цифра за что отвечает, так проще:
- 0 — никаких прав;
- 1 — только выполнение;
- 2 — только запись;
- 3 — выполнение и запись;
- 4 — только чтение;
- 5 — чтение и выполнение;
- 6 — чтение и запись;
- 7 — чтение запись и выполнение.
Права на папку linux такие же, как и для файла. Во время установки прав сначала укажите цифру прав для владельца, затем для группы, а потом для остальных. Например, :
- 744 — разрешить все для владельца, а остальным только чтение;
- 755 — все для владельца, остальным только чтение и выполнение;
- 764 — все для владельца, чтение и запись для группы, и только чтение для остальных;
- 777 — всем разрешено все.
Каждая из цифр не зависит от предыдущих, вы вбираете именно то, что вам нужно. Теперь давайте рассмотрим несколько опций команды, которые нам понадобятся во время работы:
- -c — выводить информацию обо всех изменениях;
- -f — не выводить сообщения об ошибках;
- -v — выводить максимум информации;
- —preserve-root — не выполнять рекурсивные операции для корня «/»;
- —reference — взять маску прав из указанного файла;
- -R — включить поддержку рекурсии;
- —version — вывести версию утилиты;
Теперь, когда вы знаете опции и как настраиваются права доступа chmod, давайте рассмотрим несколько примеров как работает команда chmod linux.
ERRORS top
Depending on the filesystem, errors other than those listed below can be returned. The more general errors for chmod() are listed below: EACCES Search permission is denied on a component of the path prefix. (See also path_resolution(7).) EBADF (fchmod()) The file descriptor fd is not valid. EBADF (fchmodat()) pathname is relative but dirfd is neither AT_FDCWD nor a valid file descriptor. EFAULT pathname points outside your accessible address space. EINVAL (fchmodat()) Invalid flag specified in flags. EIO An I/O error occurred. ELOOP Too many symbolic links were encountered in resolving pathname. ENAMETOOLONG pathname is too long. ENOENT The file does not exist. ENOMEM Insufficient kernel memory was available. ENOTDIR A component of the path prefix is not a directory. ENOTDIR (fchmodat()) pathname is relative and dirfd is a file descriptor referring to a file other than a directory. ENOTSUP (fchmodat()) flags specified AT_SYMLINK_NOFOLLOW, which is not supported. EPERM The effective UID does not match the owner of the file, and the process is not privileged (Linux: it does not have the CAP_FOWNER capability). EPERM The file is marked immutable or append-only. (See ioctl_iflags(2).) EROFS The named file resides on a read-only filesystem.
Связанные команды
chown – Изменить владельца файлов или каталогов.getfacl – Показать списки контроля доступа к файлам.ls – список содержимого каталога или каталогов.
Инструкции <хедер class=”author-хедер”>
Запись прав доступа числом
Пример:
chmod 764 myfile
В данном формате права доступа задаются не символами rwx, как описано выше, а трехзначным числом. Каждая цифра числа означает определенный набор прав доступа.
- Первая цифра используется для указания прав доступа для пользователя.
- Вторая цифра для группы.
- Третья для всех остальных.
В таблице ниже приводятся все возможные комбинации разрешений rwx и соответсвующие им числа (которые используются в команде chmod):
разрешения отсутствуют | — | |
1 | x — запуск | –x |
2 | w — изменение | -w- |
3 | x+w — запуск+изменение | -wx |
4 | r — чтение | r– |
5 | r+x — чтение+запуск | r-x |
6 | r+w — чтение+изменение | rw- |
7 | r+w+x — чтение+изменение+запуск | rwx |
Рассмотрим использование команды chmod с записью прав доступа числом на примере. Установим для файла права доступа 764:
chmod 764 myfile
Это означает (см. таблицу выше), что для файла myfile мы устанавливаем права доступа 764, которые означают:
- 7 — права для владельца-пользователя. Владелец файла может читать, изменять и запускать файл (r+w+x).
- 6 — права для группы. Пользователи, которые принадлежат группе могут читать и изменять файл (r+w).
- 4 — права для всех остальных. Все остальные могут только читать файл (r).
Если записать 764 с помощью символов (см. таблицу), то мы получим: «rwxrw-r-».
В таблице ниже приведены некоторые часто используемые значения числовых значений прав доступа:
400 | -r——– | Владелец файла может только читать файл. Для всех остальных все действия с файлом запрещены. |
644 | -rw-r–r– | Все пользователи могут читать файл. Владелец может изменять файл. |
660 | -rw-rw—- | Владелец и группа могут читать и изменять файл. Для всех остальных все действия с файлом запрещены. |
664 | -rw-rw-r– | Все могут читать файл. Владелец и группа могут изменять. |
666 | -rw-rw-rw- | Все могут читать и изменять файл. |
700 | -rwx—— | Владелец может читать, изменять и запускать файл. Для всех остальных все действия с файлом запрещены. |
744 | -rwxr–r– | Все могут читать файл. Владелец может также изменять и запускать файл. |
755 | -rwxr-xr-x | Все могут читать и запускать файл. Владелец может также изменять файл. |
777 | -rwxrwxrwx | Все пользователи могут читать, изменять и редактировать файл. |
Запись прав доступа символами
Примеры:
chmod +x myfile1
chmod g=rw myfile2
chmod u-w myfile3
Как вы можете видеть, в данном формате права доступа задаются символами rwx, но в синтаксисе используются и другие вспомогательные символы, например, математические операции «+» и «-» и такие символы как, например, «g» или «u».
Общий синтаксис можно записать примерно так:
chmod (владелец)(математическая операция)(разрешения) имя_файла
Обозначения для владельцев файла следующие:
u | Владелец-пользователь. |
g | Группа. |
o | Все остальные. |
a | Вообще все. |
Математические операции означают следующее:
+ | Добавляет к текущим правам доступа новое разрешение. |
– | Удаляет из текущих прав доступа определенное разрешение. |
= | Устанавливает полностью новые разрешения (предыдущие перезаписываются новыми). |
В одной команде можно перечислять владельцев и их разрешения через запятую (см. пример ниже).
Рассмотрим примеры:
- chmod +x myfile1
В данном случае мы не используем обозначения для владельцев, а значит разрешения устанавливаются для всех пользователей. «+x» означает — установить разрешение на запуск (x) файла для всех пользователей. Это эквивалентно выполнению команды: chmod a+x myfile1.
- chmod g=rw myfile2
Здесь используется обозначение g и символ равенства «=». Это означает, что для группы мы устанавливаем права доступа на чтение и запись файла (rw).
- chmod u-w myfile3
Для владельца файла (u) мы удаляем разрешение на изменение (w) файла.
- chmod ug+x myfile2
Разрешаем владельцу (u) и группе (g) запускать файл (x).
- chmod u+x,g-w,o-r myfile3
Это как раз тот случай, когда мы перечисляем владельцев через запятую и устанавливаем для них разрешения. Для владельца файла (u) мы разрешаем запуск файла, для группы (g) мы запрещаем изменять файл, для всех остальных (o) мы запрещаем читать файл.
Рекурсивное изменение прав доступа
Если необходимо изменить права доступа на все файлы в директории, включая вложенные директории, то для этого существует опция -R, что означает рекурсивное изменение прав доступа для директорий и их содержимого. Например, изменим права доступа у всех файлов в директории Mydir:
chmod -R 644 Mydir
И еще один момент. Если пользователь не является владельцем файла, но ему нужно изменить права доступа у данного файла, то команду chmod необходимо выполнять с использованием sudo, например:
sudo chmod 644 file
Числовой режим
Chmod также поддерживает числовой режим, когда используются числовые значения, присвоенные каждой позиции:
owner | group | other | ||||||
r | w | x | r | w | x | r | w | x |
400 | 200 | 100 | 40 | 20 | 10 | 4 | 2 | 1 |
Общее значение набора прав может быть вычислено и передано команде chmod в качестве одного аргумента. Возьмем пример с Дениз и ее скриптом. Если она использует числовой режим, чтобы установить права для своего сценария, она должна сначала вычислить итоговое значение:
Суммируем числа, соответствующие каждому разрешению, которое она хочет применить:
400 + 200 + 100 = 700
То есть, ее команда будет .
Теперь предположим, что Дениз решила сбросить исходные права доступа к файлу:
Рассчитываем числовое значение:
400 + 200 + 40 + 20 + 4 = 664
Значит, Дениз может использовать команду .
А чтобы установить разрешение на чтение и запись для владельца файла и только на чтение для группы и остальных используем команду rw-r–r– chmod или chmod 644 file.
Давайте рассмотрим, что такое chmod 777. В случае использования этой команды вы предоставляете права на чтение, запись и выполнение владельцу, группе и другим. Поэтому эта команда считается потенциально очень опасной.
Sudo и su
Зная чей-либо пароль, можно непосредственно зарегистрироваться в системе под его именем, введя команду .
Программа su служит для выполнения от имени указанного пользователя (по умолчанию — root) указанной команды/программы (по умолчанию — той программы, что определена в качестве оболочки (shell) для указанного пользователя) и запрашивает она пароль указанного пользователя.
О программе sudo можно сказать почти то же самое, за двумя исключениями:
- Нет «программы по умолчанию». для запуска оболочки, определённой для указанного пользователя, надо передать программе опцию -i.
- По умолчанию запрашивается не пароль указанного пользователя, а пароль пользователя, выполняющего программу sudo. какому пользователю, какие программы и от чьего имени можно запускать, определяется содержимым конфигурационного файла (редактируется с помощью программы visudo).
COLOPHON top
This page is part of release 5.13 of the Linux man-pages project. A description of the project, information about reporting bugs, and the latest version of this page, can be found at https://www.kernel.org/doc/man-pages/. Linux 2021-08-27 CHMOD(2)
Pages that refer to this page:
chmod(1),
access(2),
chown(2),
execve(2),
fcntl(2),
mkdir(2),
mknod(2),
open(2),
rename(2),
rmdir(2),
stat(2),
statx(2),
syscalls(2),
umask(2),
unlink(2),
euidaccess(3),
shm_open(3),
capabilities(7),
inotify(7),
shm_overview(7),
signal-safety(7),
spufs(7),
symlink(7),
system_data_types(7),
unix(7),
logrotate(8),
xfs_db(8)
Technical description
chmod changes the file mode of each specified FILE according to MODE, which can be either a symbolic representation of changes to make, or an octal number representing the bit pattern for the new mode bits.
The format of a symbolic mode is:
[ugoa…][[+-=][perms…]…]
where perms is either zero or more letters from the set r, w, x, X, s and t, or a single letter from the set u, g, and o. Multiple symbolic modes can be given, separated by commas.
A combination of the letters u, g, o, and a controls which users’ access to the file will be changed: the user who owns it (u), other users in the file’s group (g), other users not in the file’s group (o), or all users (a). If none of these are given, the effect is as if a were given, but bits that are set in the umask are not affected.
The operator + causes the selected file mode bits to be added to the existing file mode bits of each file; — causes them to be removed; and = causes them to be added and causes unmentioned bits to be removed except that a directory’s unmentioned set user and group ID bits are not affected.
The letters r, w, x, X, s and t select file mode bits for the affected users: read (r), write (w), execute (x), execute only if the file is a directory or already has execute permission for some user (X), set user or group ID on execution (s), restricted deletion flag or sticky bit (t). For directories, the execute options X and X define permission to view the directory’s contents.
Instead of one or more of these letters, you can specify exactly one of the letters u, g, or o: the permissions granted to the user who owns the file (u), the permissions granted to other users who are members of the file’s group (g), and the permissions granted to users that are in neither of the two preceding categories (o).
A numeric mode is from one to four octal digits (-7), derived by adding up the bits with values 4, 2, and 1. Omitted digits are assumed to be leading zeros. The first digit selects the set user ID (4) and set group ID (2) and restricted deletion or sticky (1) attributes. The second digit selects permissions for the user who owns the read (4), write (2), and execute (1); the third selects permissions for other users in the file’s group, with the same values; and the fourth for other users not in the file’s group, with the same values.
chmod never changes the permissions of symbolic links; the chmod system call cannot change their permissions. However, this is not a problem since the permissions of symbolic links are never used. However, for each symbolic link listed on the command line, chmod changes the permissions of the pointed-to file. In contrast, chmod ignores symbolic links encountered during recursive directory traversals.
Синтаксис
chmod mode file1
Опции:
- — рекурсивное изменение прав доступа для каталогов и их содержимого;
- не выдавать сообщения об ошибке для файлов, чьи права не могут быть изменены;
- подробно описывать действие или отсутствие действия для каждого файла.
Сhmod никогда не изменяет права на символьные ссылки. Однако, для каждой символьной ссылки, заданной в командной строке, Сhmod изменяет права доступа связанного с ней файла. При этом Сhmod игнорирует символьные ссылки, встречающиеся во время рекурсивной обработки каталогов.
Аргумент команды Сhmod, задающий разрешения, может быть записан в двух форматах: в числовом и в символьном.
Базовые права
Команда ls -l отображает права доступа, назначенные файлу. Например:
Некоторые права (rw) появляются более одного раза, потому что они относятся к разным объектам: user (пользователь), group (группа) и other (другое). User – здесь синоним владельца, group – это основная группа пользователя, обе — bruce. Other относится ко всем остальным пользователям.
Первый знак обозначает тип объекта: — для файла, d — для директории (как еще говорят, chmod на папку) и l — для символической ссылки. Следующие девять символов сгруппированы по три и описывают режим прав. Позиции упорядочены по r, w, x, а группы упорядочены по user, group, other.
— — — | rwx rwx rwx |
uuu ggg ooo | u=user, g=group, o=other |
Файлы
У нас есть файл с правами на чтение, запись и выполнение, установленными для всех объектов:
Конечно, в реальном мире мы обычно не настраиваем файлы с такими правами; это просто иллюстрация того, как используется каждая позиция.
В следующем примере файл сконфигурирован так, чтобы его владелец (pablo) имел права на чтение и запись, члены группы — только на чтение, а остальные – не имели никаких прав.
Команда chmod изменяет режим прав объектов в системе. Это одна из наиболее используемых и важных команд в наборе команд безопасности Linux.
Символ плюс (+) добавляет права, а символ минус (-) удаляет права. Вы можете прочитать chmod u+r как «пользователь плюс чтение», так как она дает пользователю права на чтение. Команда chmod u-r означает «пользователь минус чтение», так как забирает у пользователя права на чтение.