Linux как изменить атрибуты файла

Состояние перевода: На этой странице представлен перевод статьи File permissions and attributes. Дата последней синхронизации: 10 февраля 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Состояние перевода: На этой странице представлен перевод статьи File permissions and attributes. Дата последней синхронизации: 10 февраля 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Файловые системы используют разрешения и атрибуты для регулирования уровня взаимодействия, которые системные процессы могут иметь с файлами и каталогами.

Важно: При использовании в целях безопасности разрешения и атрибуты защищают только от атак, запускаемых из запущенной системы. Для защиты хранимых данных от злоумышленника с физическим доступом необходимо реализовать шифрование диска.

Просмотр разрешений

Чтобы посмотреть разрешения (или права файла), используйте команду ls с опцией -l для просмотра содержимого каталога, например:

$ ls -l /путь/к/каталогу
итого 128
-rw-rw-r-- 1 archie users  5120 апр 27 08:28 customers.ods
-rw-r--r-- 1 archie users  3339 апр 27 08:28 todo
-rwxr-xr-x 1 archie users  2048 май  6 12:56 myscript.sh
drwxr-xr-x 6 archie users  4096 июл  5 17:37 Документы
drwxr-xr-x 2 archie users  4096 июл  5 13:45 Загрузки
drwxr-xr-x 2 archie users  4096 июл  5 21:03 Рабочий стол

Здесь мы должны сосредоточиться на первом столбце. Например, обратив внимания на значение drwxrwxrwx+, каждый символ которого объясняется в следующих таблицах:

d rwx rwx rwx +
Обозначет тип файла, технически не относится к разрешениям. Смотрите типы файлов (UNIX) для ознакомления со всеми возможными значениями. Разрешения, которые имеет владелец к файлу (объяснения ниже). Разрешения, которые имеет группа к файлу (объяснения ниже). Разрешения, которые имеют все остальные пользователи к файлу (объяснения ниже). Одиночный символ, который указывает на применение альтернативного метода доступа. Пробел указывает на отсутствие альтернативного метода доступа. Символ . обозначает файл с контекстом безопасности, но без другого альтернативного метода доступа. Файл с любой другой комбинацией альтернативных методов доступа помечается символом +, например в случае Access Control Lists (Русский).

Каждая из трёх триад разрешений (rwx в примере выше) может состоять из следующих символов:

Символ Влияние на файлы Влияние на директории
Разрешение на чтение (первый символ) - Файл не может быть прочитан. Содержимое каталога не может быть показано.
r Файл можно прочитать. Содержимое каталога может быть показано.
Разрешение на запись (второй символ) - Файл не может быть изменён. Содержимое каталога не может быть изменено.
w Файл может быть изменён. Содержимое каталога может быть изменено (создание новых файлов или папок; переименовывание и удаление существующих файлов или папок); дополнительно требуется разрешение на выполнение, в противном случае, это разрешение не действует.
Разрешение на выполнение (третий символ) - Файл не может быть выполнен. Каталог не может быть доступен с помощью cd.
x Файл может быть выполнен. Доступ к каталогу можно получить с помощью cd. Это единственный бит, который на практике можно считать «наследуемым» от каталогов-предков; фактически, если какой-либо каталог в пути не имеет установленного бита x, конечный файл или каталог также оказывается недоступен независимо от его разрешений; подробнее смотрите path_resolution(7).
s Показывает установленный suid бит: в триаде пользователя — setuid; в триаде группы — setgid; в триаде остальных не встречается; также подразумевает, что установлен бит x.
S То же, что и s, но бит x не установлен; редко встречается у обычных файлов, бесполезен для каталогов.
t Sticky bit; встречается только в триаде остальных; также подразумевает, что установлен бит x.
T То же, что и t, но бит x не установлен; редко встречается у обычных файлов.

Смотрите info Coreutils -n "Mode Structure" и chmod(1) для более подробной информации.

Совет: Также можно посмотреть разрешения с помощью команды namei -l путь.

Примеры

Давайте посмотрим несколько примеров для лучшего понимания:

drwx------ 6 archie users  4096 июл  5 17:37 Документы

Archie имеет полный доступ к каталогу Документы. Он может просматривать, создавать, переименовывать и удалять любые файлы в Документах, независимо от прав доступа к файлам. Его возможность получить доступ к файлам зависит от разрешений самого файла.

dr-x------ 6 archie users  4096 июл  5 17:37 Документы

Archie имеет полный доступ, за исключением создания, переименовывания и удаления файлов. Он может просматривать список файлов и (если позволяют разрешения к файлам) может получить доступ к существующему файлу в Документах.

d-wx------ 6 archie users  4096 июл  5 17:37 Документы

Archie не может выполнить ls в Документах, но если он знает имя существующего файла, то он может просмотреть, переименовать и удалить или (если позволяют разрешения) получить доступ к нему. Также он может создавать новые файлы.

d--x------ 6 archie users  4096 июл  5 17:37 Документы

Archie может только (если позволяют разрешения файла) получить доступ к тем файлам в Документах, о которых он знает. Он не может просмотреть уже существующие файлы или создавать, переименовывать и удалить любой из них.

Имейте в виду, что мы рассматриваем права доступа к каталога, но это не имеет ничего общего с правами доступа к отдельным файлам. При создании нового файла выполняется изменение каталога, в котором он создаётся. Вот почему нужно иметь разрешение на запись в каталог.

Давайте посмотрим на другой пример, на этот раз файл, а не каталог:

-rw-r--r-- 1 archie users  5120 июн 27 08:28 foobar

Здесь мы видим первой буквой не d, а -. Таким образом мы знаем, что это файл, а не директория. Благодаря разрешению rw- владелец может читать и писать, но не выполнять. Может показаться странным, что у владельца нет всех трёх разрешений, но разрешение x не требуется, так как это файл текста/данных, который может быть прочитан текстовым редактором, например Gedit, EMACS или программным обеспечением подобно R, а не исполнятся самим файлом (если он содержит что-то вроде программного кода на Python, то тогда подобное вполне возможно). Для группы установлены права доступа r--, поэтому у группы есть возможность читать файл, но не записывать и не редактировать его — фактически это установка чего-либо только для чтения. Мы видим, что подобные разрешения применимы и ко всем остальным пользователям.

Изменение разрешений

chmod это команда в Linux и других Unix-подобных операционных системах, которая позволяет изменять права доступа к файлам или каталогам.

Текстовый метод

Для изменения прав доступа — или режима доступа — к файлу используйте команду chmod в терминале. Ниже приведена общая структура команды:

chmod кто=разрешения имя_файла

Где кто — любая из нескольких букв, каждая из которых обозначает, кому дано разрешение. Они следующие:

  • u (user): пользователь, который является владельцем файла.
  • g (group): группа пользователей, которой принадлежит этот файл.
  • o (other): другие пользователи, то есть все остальные.
  • a (all): все сразу; используйте вместо ugo.

Права доступа обозначаются так же, как описано в разделе #Просмотр разрешений (r, w и x).

Теперь посмотрите на некоторые примеры использования этой команды. Предположим, вы захотели сильно защитить каталог Документы и отказать всем, кроме себя, в разрешении на чтение, запись и выполнение (или, в данном случае, поиск/просмотр) внутри него:

До: drwxr-xr-x 6 archie users 4096 июл 5 17:37 Документы

$ chmod g= Документы
$ chmod o= Документы

После: drwx------ 6 archie users 4096 июл 6 17:32 Документы

Здесь, поскольку вы хотите отказать в разрешениях, вы не ставите никаких букв после =, где будут введены разрешения. Из этого видно, что только разрешения владельца — это rwx, а все остальные разрешения — это -.

Это можно восстановить с помощью:

До: drwx------ 6 archie users 4096 июл 6 17:32 Документы

$ chmod g=rx Документы
$ chmod o=rx Документы

После: drwxr-xr-x 6 archie users 4096 июл 6 17:32 Документы

В следующем примере вы предоставляете права на чтение и выполнение группе и другим пользователям, поэтому вы ставите следующие буквы для этих прав (r и x) после =, не оставляя пробелов.

Вы можете упростить это поместив более одной буквы кто в одну и ту же команду, например:

$ chmod go=rx Документы

Примечание: Не имеет значения, в каком порядке вы ставите буквы кто или буквы разрешений в команде chmod: команды chmod go=rx file и chmod og=xr file делают одно и то же.

Рассмотрим ещё один пример: предположим, вы хотите изменить файл foobar так, чтобы у вас были разрешения на чтение и запись, а коллеги из группы users, которые могут совместно работать с файлом foobar, также могли читать и записывать файл, а все остальные пользователи могли только читать его:

До: -rw-r--r-- 1 archie users 5120 июн 27 08:28 foobar

$ chmod g=rw foobar

После: -rw-rw-r-- 1 archie users 5120 июн 27 08:28 foobar

Это точно такой же пример, как и первый, но с файлом, а не каталогом, и вы предоставляете разрешение на запись (просто для того, чтобы привести пример предоставления каждого разрешения).

Сокращения для текстового метода

Команда chmod позволяет добавлять и вычитать разрешения из существующих, используя + или - вместо =. Это отличается от описанных выше команд, которые по сути переписывают разрешения (например, чтобы изменить разрешения с r-- на rw-, вам всё равно нужно указать r и w после = в вызове команды chmod. Если вы пропустите r, то = перезапишет разрешения и таким образом удалит разрешение r. Использование + и - позволяет избежать этого, добавляя или отнимая текущий набор разрешений).

Давайте попробуем применить + и - на предыдущем примере добавления разрешений на запись в группу:

До: -rw-r--r-- 1 archie users 5120 июн 27 08:28 foobar

$ chmod g+w foobar

После: -rw-rw-r-- 1 archie users 5120 июн 27 08:28 foobar

Ещё пример, который запрещает запись абсолютно всем (a):

До: -rw-rw-r-- 1 archie users 5120 июн 27 08:28 foobar

$ chmod a-w foobar

После: -r--r--r-- 1 archie users 5120 июн 27 08:28 foobar

Также есть специальный режим X: это не настоящий файловый режим, но он часто используется вместе с опцией -R, чтобы добавить бит выполнения только каталогам, но оставить его нетронутым у файлов. Типичный пример использования:

$ chmod -R a+rX ./data/

Копирование разрешений

С помощью chmod можно взять разрешения у одного класса, например владельца, и выставить те же разрешения группе или даже всем. Для этого вместо r, w или x после = поставьте нужную вам букву кто. Например:

До: -rw-r--r-- 1 archie users 5120 июн 27 08:28 foobar

$ chmod g=u foobar

После: -rw-rw-r-- 1 archie users 5120 июн 27 08:28 foobar

Эта команда по сути означает «изменить разрешения группы (g=), чтобы они были такими же, как у владельца (=u)». Обратите внимание, что вы не можете скопировать одновременно несколько разрешений или добавить новые, то есть такая команда:

$ chmod g=wu foobar

выдаст ошибку.

Числовой метод

Команда chmod позволяет задавать разрешения в виде чисел.

Использование чисел — это ещё один метод, который позволяет редактировать разрешения одновременно для владельца, группы и остальных, а также биты setuid, setgid и sticky. Основная структура такова:

$ chmod xxx путь

где xxx это три цифры, каждое их которых может иметь значение от 0 до 7. Первая цифра задаёт разрешения для владельца, вторая — для группы, а третья — для всех остальных.

Права r, w и x соответствуют следующим числам:

r=4
w=2
x=1

Чтобы объединить нужные права в одно трёхзначное число, нужно суммировать соответствующие значения. Например, если вы хотите предоставить владельцу каталога права на чтение, запись и выполнение, а группе и всем остальным — только права на чтение и выполнение, то числовые значения будут выглядеть следующим образом:

  • Владелец: rwx=4+2+1=7
  • Группа: r-x=4+0+1=5
  • Остальные: r-x=4+0+1=5
$ chmod 755 путь

Это эквивалентно следующим двум командам:

$ chmod u=rwx путь
$ chmod go=rx путь

Чтобы посмотреть текущие права в числовом виде, можно использовать команду stat(1):

$ stat -c %a путь

где %a задаёт числовой формат вывода.

Большинство каталогов имеют значение 755, которое разрешает чтение, запись и выполнение для владельца, но запрещает запись для всех остальных, а файлы обычно имеют значение 644, разрешающее чтение и запись для владельца, но только чтение для всех остальных; так как большинство файлов не являются исполняемыми, то бит выполнения x у них не установлен.

Чтобы увидеть этот метод в действии, рассмотрим тот же пример с файлом, который уже использовался, но вместо него используем числовой метод:

До: -rw-r--r-- 1 archie users 5120 июн 27 08:28 foobar

$ chmod 664 foobar

После: -rw-rw-r-- 1 archie users 5120 июн 27 08:28 foobar

Для исполняемого файла вы могли бы задать 774, если бы вы хотели предоставить разрешение на исполнение владельцу и группе. Если бы вы хотели, чтобы у всех было разрешение только на чтение, число было бы 444. Если рассматривать r как 4, w как 2 и x как 1, то это, вероятно, самый простой способ вычислить числовые значения для использования chmod xxx путь, но существует также двоичный метод, при котором каждое разрешение рассматривается как двоичное число, а затем они объединяются в обычное десятичное число. Этот способ немного более запутанный, но для полноты картины он здесь приведён.

Рассмотрим такой набор разрешений:

-rwxr-xr--

Если вы пропишите 1 на месте каждого выданного разрешения и 0 на месте отсутствующих разрешений, получится такое двоичное число:

-rwxrwxr-x
 111111101

Затем можно преобразовать двоичные числа:

000=0	    100=4
001=1	    101=5
010=2	    110=6
011=3	    111=7

Итоговое значение получается 775.

Допустим, мы хотим удалить разрешение на запись из группы:

-rwxr-xr-x
 111101101

Итоговое значение будет равно 755, и вы можете использовать команду chmod 755 имяфайла, чтобы снять разрешение на запись. Обратите внимание, что вы получите одно и то же трёхзначное число независимо от того, какой метод вы используете. Используете ли вы текст или цифры, зависит от личных предпочтений и скорости набора текста. Если вы хотите вернуть файлу или каталогу права по умолчанию, например, разрешение на чтение и запись (и выполнение) для владельца, но запретить запись для всех остальных, может быть быстрее использовать chmod 755/644 имяфайла. Однако если вы меняете разрешения на что-то нестандартное, проще и быстрее использовать текстовый метод, а не выполнять преобразование в числа, в процессе которого можно случайно ошибиться. Для пользователя, который использует chmod изредка, вероятно, нет существенной разницы в скорости использования обоих методов.

Вы также можете использовать числовой метод для установки битов setuid, setgid и sticky, используя четыре цифры.

setuid=4
setgid=2
sticky=1

Например, chmod 2777 имяфайла выдаст всем права на чтение/запись/выполнение и включит бит setgid.

Массовое изменение разрешений

Как правило, каталоги и файлы не должны иметь одинаковые разрешения. Если необходимо массово изменить дерево каталогов, используйте find для выборочного изменения чего-то одного.

Чтобы выставить разрешения 755 только каталогам:

$ find каталог -type d -exec chmod 755 {} +

Чтобы выставить разрешения 644 только файлам в каталоге:

$ find каталог -type f -exec chmod 644 {} +

Изменение владельца

chown изменяет владельца файла или каталога, что в некоторых случаях быстрее и проще, чем изменение прав доступа.

Рассмотрим следующий пример: создание нового раздела с помощью GParted для резервного копирования данных. Gparted делает всё это от имени root, поэтому по умолчанию всё принадлежит root. Всё это хорошо, но обычные пользователи не смогут записать данные в смонтированный раздел.

brw-rw---- 1 root disk 8,    9 июл  6 16:02 sda9
drwxr-xr-x 5 root root    4096 июл  6 16:01 Backup

В данном примере устройством в /dev владеет root, как и каталогом для монтирования (/media/Backup). Чтобы изменить владельца каталога, можно сделать следующее:

До: drwxr-xr-x 5 root root 4096 июл 6 16:01 Backup

# chown archie /media/Backup

После: drwxr-xr-x 5 archie root 4096 июл 6 16:01 Backup

Теперь новый владелец archie может записывать данные в этот раздел без изменения разрешений (потому что изначально уже стояли права rwx, разрешающие запись владельцу).

Примечание:

  • chown всегда сбрасывает биты setuid и setgid.
  • Обычные пользователи не могут использовать chown для «передачи» файлов, которыми они владеют, другому пользователю.

Списки управления доступом

Списки управления доступом (Access Control Lists, ACL) предоставляют дополнительный, более гибкий механизм разрешений для файловых систем, позволяя устанавливать разрешения для любого пользователя или группы на любой файл.

Umask

Утилита umask используется для управления маской режима, которая определяет начальное значение битов разрешения файлов для создаваемых файлов.

Атрибуты файла

Помимо битов режима файла, которые управляют разрешениями пользователей и групп на чтение, запись и выполнение, некоторые файловые системы поддерживают атрибуты файла, которые позволяют дополнительно настраивать допустимые операции с файлами.

Важно: По умолчанию cp, rsync и другие подобные программы не сохраняют эти атрибуты.

Пакет e2fsprogs содержит программы lsattr(1) и chattr(1), которые позволяют просмотреть и изменить атрибуты файла соответственно.

Здесь приведены некоторые полезные атрибуты. Не все файловые системы поддерживают каждый упомянутый атрибут.

  • a — append only: Файл может быть открыт только для добавления.
  • c — compressed: Включить сжатие на уровне файловой системы для файла.
  • i — immutable: Не может быть изменён, удалён или переименован. Может быть установлен только пользователем root.
  • j — data journaling: Использовать журнал для записи данных файла так же, как и метаданных.
  • m — no compression: Отключить сжатие на уровне файловой системы для файла.
  • A — no atime update: Время получения доступа к файлу не будет обновляться.
  • C — no copy on write: Отключение copy-on-write на поддерживающих это файловых системах.

Полный список атрибутов и подробную информацию о них можно прочитать в chattr(1).

Пример установки атрибута immutable:

# chattr +i /путь/к/файлу

Для снятия атрибута замените + на -.

Расширенные атрибуты

Расширенные атрибуты (Extended attributes) — это пары ключ-значение, привязанные к файлу или каталогу. Существует четыре их класса: security, system, trusted и user.

Важно: По умолчанию cp, rsync и другие подобные программы не сохраняют расширенные атрибуты, смотртие #Сохранение расширенных атрибутов.

Расширенные атрибуты используются для Capabilities.

Пользовательские расширенные атрибуты

Класс user может использоваться для хранения дополнительной информации о файле. Пример создания атрибута:

$ setfattr -n user.checksum -v "3baf9ebce4c664ca8d9e5f6314fb47fb" foo.txt

Просмотр имеющихся атрибутов:

$ getfattr -d foo.txt
# file: foo.txt
user.checksum="3baf9ebce4c664ca8d9e5f6314fb47fb"

Удаление атрибута:

$ setfattr -x user.checksum foo.txt

Сохранение расширенных атрибутов

Команда Требуемый флаг
cp --preserve=mode,ownership,timestamps,xattr
mv сохраняет по умолчанию1
tar --xattrs для создания --xattrs-include='*' для извлечения
bsdtar -p для извлечения
rsync --xattrs
  1. mv без предупреждения убирает расширенные атрибуты, если целевая файловая система их не поддерживает.

Чтобы сохранить расширенные атрибуты в текстовых редакторах, настройте их на усечение (truncate) файлов при сохранении вместо использования rename(2).[1]

Советы и рекомендации

Preserve root

Используйте флаг --preserve-root, чтобы предотвратить рекурсивное выполнение chmod на /. Это поможет, например, предотвратить удаление бита выполнения во всей системе и тем самым сломать систему. Чтобы использовать этот флаг всегда, пропишите его в псевдониме. Смотрите также [2].

Смотрите также

  • chattr — Википедия
  • Linux File Permission Confusion
  • Linux File Permission Confusion part 2
  • wikipedia:Extended file attributes#Linux
  • Extended attributes: the good, the not so good, the bad.
  • Backup and restore file permissions in Linux
  • Why is «chmod -R 777 /» destructive?

Сейчас расскажу как можно изменить атрибуты на файлы в UnixLinux и приведу готовые примеры в своей статье «Изменение атрибутов (флагов) на файлах в Unix/Linux».

1. chattr

chattr — изменяет атрибуты файлов на файловых системах ext2fs, ext3, ext4 и частично на других файловых системах Linux.

# chattr [ -RV ] [ -v версия ] [ атрибуты ] файлы

Формат символьного режима:  +-=[acdeijstuACDST].

«+» обозначает добавление указанных атрибутов к существующим;
«-» обозначает их снятие;
«=» обозначает установку только этих атрибутов файлам.

Символы «acdeijstuACDST» указывают на новые атрибуты файлов, некоторые атрибуты может назначить только суперпользователь (root):

  • Не обновлять время последнего доступа к файлу atime (A)
  • Использовать синхронное обновление (S)
  • Использовать синхронное обновление каталогов (D)
  • Только добавление к файлу (a)
  • Сжатый (c)
  • Не архивировать (d)
  • Неизменяемый (i)
  • Безопасное удаление (s)
  • Вершина иерархического дерева (T)
  • Запрет слияния в конце файла (t)
  • Неудаляемый (u)
  • Нет копирования при записи (C)
  • Журналирование данных (j)
  • extent format (e)

2. lsattr

Формат символьного режима:

  • Огромный файл (h),
  • Ошибки сжатия (E),
  • Индексированный каталог (I),
  • Сжатие прямого доступа(X),
  • Сжатый грязный файл (Z).

Опции
-R

Рекурсивное изменение атрибутов каталогов и их содержимого.

-V

Вывод на экран с выводом chattr и показать версию программы.

-f

Запретить большинство сообщений об ошибках.

-v

Вывести версию программы.

-d

Вывести все атрибуты для всех каталогах.

-a

Вывести все атрибуты для всех файлов.

Примеры.

Linux

В Linux есть утилита chattr, она может выставлять нужные флаги на файлы и папки, но все изменения проводить может только пользователь root.

Выставляем флаг который нельзя удалить (может только root):

# chattr +i /tmp/test

Просмотр всех флагов для папок и файлов:

$ lsattr -a /home/captain/public_html/

----i------------e- test
-------------e- ./wp-login.php
-------------e- ./readme.html
-i----u------e- ./wp-settings.php
................................

Чтобы убирать флаги i,u для всех файлов в папке:

# chattr -iau /home/captain/public_html/*
# chattr -iau /home/captain/public_html/.*

Проверим стоит ли права, после применения команды:

$ lsattr -a

или

lsattr `find .`|grep -- "-u--ia-------"

Я сбросил все атрибуты в 000, нужно дял файлов теперь выставить нормальные (это 644), для этого используем:

 # chmod 644 `find . -perm 000`

И нужно поменять владельца сайта ( у меня кто-то сменил на пользователя root, видимо нашли уязвимость и проделали этот трюк для своих нужд), по этому, исправляем:

# chown -R captain:captain `find /home/ -user root`

или

$ chown -R captain:captain /home/homewhol/public_html/

Иногда нужно менять еще и права на папки и файлы, я использую эту статью для этого:
выставить права на папки 755 и права на файлы 644

Если нужно больше информации о командах chattr или lsattr, то читаем мануал:

$ man chattr
$ man lsattr

Разрешаем ядру автоматически сжимать или разжимать файл:

# chattr +c my_test_file1

Игнорируем данный файл когда используем команды dump:

# chattr +d my_test_file1

Запрешаем изменение бинарников:

# chattr -R +i /bin /sbin /usr/bin /usr/sbin

Удалим атрибут ‘s’  с файла, но он после этого будет заполнен нулями и перезаписан на
диск:

# chattr +s my_test_file1

Только добавление данных (append-only), удаление и переименование запрещено (Предотвращаем модификацию лога злоумышленником):

# chattr +a /var/log/secure

Если удалить файл с этим атрибутом, то он будет сохранен и пользователь может восстановить данные при необходимости:

# chattr +u my_test_file

Удостовериться что все изменения файла сразу будут записаны на диск:

# chattr +S my_test_file1

FreeBSD/OpenBSD

В *BSD, данной функцией обладает утилита chflags. Приведу несколько примеров использования данной программы на freeBSD.

Чтобы выставить неудаляемый флаг (в отличии от ext это может НЕ только root):

$ chflags uunlnk /tmp/test

Проосмотреть флаги:

$ ls -lao test
-rw-r--r-- 1 skeletor wheel uunlnk 0 Jul 6 10:56 test

Чтобы убрать флаг:

$ chflags nouunlnk /tmp/test

Обо всем возможностях можно узнать в:

$ man chflags

Утилита chattr (lsattr) входят в пакет утилит — e2fsprogs (иногда называемая e2fs programs) — это набор программ для поддержания файловых систем (ext2, ext3 и ext4).

Что входит в данный пакет утилиты e2fsprogs:

  1. badblocks — используется для поиска плохих блоков;
  2. chattr — изменяет атрибуты файлов на файловой системе ext2fs;
  3. debugfs — используется для ручного просмотра и изменения внутренней структуры файловой системы;
  4. dumpe2fs — печатает superblock and block group information;
  5. e2fsck — fsck-программа, проверяющая и корректирующая несоответствия;
  6. e2image — записывает критические данные файловой системы в файл;
  7. e2label — используется для просмотра и изменения метки файловой системы;
  8. lsattr — печатает список атрибутов файловой системы;
  9. mke2fs — используется для создания файловых систем ext2, ext3 и ext4;
  10. mklost+found — создаёт каталог lost+found и выделяет для него блоки дискового пространства;
  11. resize2fs — используется для изменения пространства, выделенного под файловые системы ext2, ext3 and ext4;
  12. tune2fs — используется для модифицирования параметров файловой системы.
  13. Многие из этих утилит основаны на библиотеке libext2fs.

Тема «Изменение атрибутов (флагов) на файлах в Unix/Linux» завершена.

При использовании Linux у нас есть много способов управления доступом к ресурсам: самый основной – это установка соответствующих прав UGO/RWX на файлы и каталоги.

В некоторых случаях мы также можем использовать setuid, setgid и sticky bit.

Кроме того, мы можем использовать ACL (список контроля доступа) для достижения более высокого уровня детализации или реализовать обязательный контроль доступа, например, на основе SELinux или AppArmor.

  • 🔥 Реализация мандатного контроля доступа с помощью SELinux или AppArmor в Linux
  • ☸️ Как исправить отсутствующие профили AppArmor в microk8s на LXD

В дополнение к вышеупомянутым стратегиям, в большинстве файловых систем мы можем манипулировать набором “атрибутов”, чтобы, например, сделать файл неизменяемым.

В этой статье мы поговорим об атрибутах файлов в Linux, узнаем, как проверить атрибуты, назначенные файлу, и как ими управлять.

Содержание

  1. Вывод списка атрибутов файлов
  2. Установка и удаление атрибутов
  3. Удаление атрибутов
  4. Заключение

Вывод списка атрибутов файлов

Для составления списка атрибутов файлов в Linux можно воспользоваться утилитой lsattr, которая входит в пакет e2fsprogs наиболее распространенных дистрибутивов Linux (несмотря на название, ее можно использовать и в файловых системах, отличных от ext2/3/4, например, xfs).

Утилита принимает в качестве аргументов один или несколько файлов и поддерживает ряд опций для изменения своего поведения.

Рассмотрим пример ее использования.

Когда lsattr вызывается без каких-либо аргументов или опций, она возвращает список атрибутов, связанных с файлами и каталогами, содержащимися в рабочем каталоге, точно так же, как это делает команда ls:

lsattr

--------------e------- ./Templates

--------------e------- ./Downloads

--------------e------- ./Projects

--------------e------- ./Documents

--------------e------- ./Desktop

--------------e------- ./Music

--------------e------- ./Public

--------------e------- ./Videos

--------------e------- ./Pictures

В приведенном выше примере видно, что я вызвал команду в каталоге HOME.

Из вывода команды видно, что видимым каталогам присвоен только атрибут thee: это означает, что они используют “экстенты” для отображения блоков на диске (это связано с тем, как работает файловая система ext4).

Как видите, скрытые файлы по умолчанию не включаются в вывод; чтобы включить их, мы можем передать команде параметр -a.

Мы также можем перечислить атрибуты каталога рекурсивно, используя опцию -R, или перечислить атрибуты каталога вместо его содержимого, используя -d.

Другой полезной опцией является -l, которая используется для отображения полного имени атрибутов, связанных с файлами, вместо одной буквы, идентифицирующей их:

lsattr -l

./Templates                  Extents

./Downloads                  Extents

./Projects                   Extents

./Documents                  Extents

./Desktop                    Extents

./Music                      Extents

./Public                     Extents

./Videos                     Extents

./Pictures                   Extents

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

Здесь мы приведем лишь некоторые из них (некоторые атрибуты могут быть установлены только на определенных файловых системах – “j”, например, не может быть установлен на файловой системе ext2, которая не имеет логирования):

Атрибут Использование
a Если файл имеет атрибут a, содержимое может быть только добавлено к нему.
c Файл с атрибутом c прозрачно сжимается ядром при записи и распаковывается при чтении.
i Файл с атрибутом i не может быть изменен, удален или переименован (неизменяемый).
s Файл с атрибутом s автоматически обнуляется при удалении.
j Файл с установленным атрибутом j записывает данные в журнал файловой системы до фактической записи.

Установка и удаление атрибутов

Утилита, которую мы используем для назначения атрибутов, – это chattr; ее синтаксис довольно прост: чтобы назначить атрибут файлу, мы используем знак +, за которым следует буква атрибута, и передаем путь к файлу (файлам), которому должен быть назначен атрибут, в качестве аргумента команды.

Ранее мы уже рассматривали эту утилиту:

🐧 Предотвращение случайного удаления или изменения файлов и папок в Linux

Как разрешить редактирование файла resolv.conf Linux

Рассмотрим пример.

Предположим, у нас есть файл (допустим, он называется example.txt), и мы хотим присвоить ему атрибут a, чтобы избежать перезаписи его содержимого. Вот команда, которую мы должны выполнить:

sudo chattr +a example.txt

Вы можете заметить, что мы приписали к команде sudo, поскольку большинство атрибутов могут быть назначены или удалены только пользователем root.

Мы можем проверить, что атрибут был присвоен файлу, используя команду lsattr:

lsattr -l example.txt

example.it                   Append_Only, Extents

Теперь, если мы попытаемся записать, чтобы перезаписать файл, используя оператор перенаправления >  на shell, мы получим ошибку:

echo "line" > example.txt

bash: example.txt: Operation not permitted

см. также:

🐧 Как скопировать и вставить текстовый контент из терминала Linux

Если вместо этого мы используем оператор перенаправления >>, который делает так, что содержимое добавляется в файл, ошибок не возникает:

echo "line" >> example.txt

Вот еще один пример.

Атрибут i может быть использован для того, чтобы сделать файл неизменяемым и невозможным для удаления или перемещения даже пользователем root (который, однако, может удалить атрибут вообще):

sudo chattr +i example.txt

sudo rm example.txt

rm: cannot remove 'example.txt': Operation not permitted

Удаление атрибутов

Чтобы удалить один или несколько атрибутов из файлов, достаточно изменить “оператор”, который мы используем в chattr.

Вместо + мы используем -.

Чтобы удалить из файла “example.txt” атрибуты i и a, которые мы задали в предыдущем примере, выполните следующие действия:

sudo chattr -ai example.txt

В некоторых случаях мы хотим применить “обратную” логику и, по сути, сказать: “удалить все атрибуты, кроме указанных”: для применения этой стратегии мы можем использовать оператор =.

Заключение

В этом руководстве мы научились составлять список и управлять атрибутами файлов в Linux с помощью утилит “lsattr” и “chattr”, а также узнали значение некоторых атрибутов, таких как “i” (неизменяемый) или “a” (только для добавления).

Некоторые файловые системы принимают только определенный набор атрибутов: обратитесь к соответствующим руководствам, чтобы проверить, какие из них поддерживаются.

Чтобы узнать больше об атрибутах в целом, вы можете заглянуть в документацию вышеупомянутых утилит.

см. также:

  • Linux – Основные права доступа к файлам и каталогам
  • 🧟 Команды от A до Z Kali Linux
  • Как использовать Udev для обнаружения и управления устройствами в Linux
  • 🐧 Как сохранить права собственности и права доступа к файлам при копировании файлов или каталогов
  • ⚖ Как настроить владельца / группу файлов на устройстве с помощью правил udev
  • Автоматическое резервное копирование файлов на USB-носители при подключении
  • Обнаружение вторжений и проверка целостности файловой системы Linux с помощью AIDE
  • 📋 Что такое метаданные?
  • 🕷️ Быстрый обзор: Уязвимость обхода пути
  • 📁 Как создать скрытую, почти не удаляемую папку в Windows 10/11
  • 🐧 Как узнать дату последнего изменения файла на Linux
  • 🐚 Как проверить, какую оболочку вы используете на Linux
  • 💉 9 популярных типов атак на веб-приложения
  • 🖧 Burp Bounty: BurpSuite расширение для улучшения активного и пассивного сканера
  • Как получить информацию о системе в Ubuntu Linux
  • Как показать скрытые файлы зараженные вирусом

Linux chattr and lsattr commands

Updated: 11/30/2020 by

chattr and lsattr commands

On Linux operating systems, the chattr command modifies the attributes of files, and lsattr lists (displays) them.

In Linux, file attributes are flags which affect how the file is stored and accessed by the filesystem. They are metadata stored in the file’s associated inode.

Description

chattr and lsattr are part of the e2fsprogs software package, available by that name in most package managers. The e2fsprogs homepage is located at https://e2fsprogs.sourceforge.net.

Note

Attributes are not the same as file permissions. For information about setting permissions, see chmod.

Syntax: chattr

chattr [-R] [-V] [-f] [-v version] [-p project] mode ... file ...

Options

chattr takes the following options:

-R Recursively change attributes of directories and their contents.
-V Provide verbose output and display program version.
-f Suppress most error messages.
-v version Set the file’s version/generation number. This is an arbitrary nine-digit number assigned to a file when it is created. It is not unique. It may be changed to any other arbitrary number.
-p project Set the file’s project number.
mode One or more mode strings. For more information, see: Mode strings, below.
file The file or files to be changed.

Mode strings

A mode string consists of an operator and one or more attributes. It takes the form:

{+|-|=}[aAcCdDeijsStTu]

One of the following operators must appear at the beginning of a mode string:

character operation
+ Attributes listed are added to the file.
Attributes listed are removed from the file.
= The attributes listed are added; any attributes omitted will be removed.

The remainder of the mode string is several characters, each representing an attribute. They are case-sensitive, cannot be separated by whitespace, and may appear in any order. For a list of attribute characters, see: Attributes, below.

Example mode strings are «+caS«, «-Asd«, and «=eAsS«.

Multiple mode strings may be specified to combine + and operators in a single command, e.g., «+asD -c» and «-a +s +D -c» are both valid.

Syntax: lsattr

lsattr [-R] [-V] [-a] [-d] [-v] file ...

Options

-R Recursively list attributes of directories and their contents.
-V Display the program version.
-a List all files in a directory, including those whose name starts with a period (‘.‘).
-d List directories as regular files, rather than listing their contents.
-v List the file’s version/generation number in addition to its attributes.

List of attributes

The following characters represent attributes that can be modified by chattr or listed with lsattr.

character attribute description
a append only The file may only be opened for writing in append mode: its existing data may not be overwritten. It cannot be deleted or renamed; hard links cannot be made to this file; most of its metadata cannot be changed. Modifying this attribute requires root privileges.
A no atime updates When the file is accessed, its atime record is not modified, which in some situations can reduce disk I/O.
c compressed Files with this attribute are automatically compressed by the kernel when written to disk. Its contents are uncompressed when read. Note: This attribute has no effect in the ext2, ext3, and ext4 filesystems.
C no copy on write Files with this attribute are not subject to copy-on-write updates. If this attribute is set on a directory, new files created in that directory get this attribute set. Note: This attribute is only effective on filesystems which perform copy-on-write. On btrfs, this attribute should be set on new or empty files. If this attribute is set after a btrfs file already contains data, the time when its data will be stable is undefined.
d no dump Files with this attribute are bypassed in any backup initiated by dump, a legacy tool for ext2 filesystems.
D synchronous directory updates Changes to a directory with this attribute are written synchronously to disk. That is, the system waits for write completion before doing something else. Equivalent to the dirsync option to the mount command, applied to a subset of files on a filesystem.
e block extents Indicates that a file should be stored using block extents. Data is stored contiguously between two blocks, and only those two blocks must be known to find the file’s data. Block extent mapping may potentially save disk space, because it reduces the number of blocks which must be listed in the file’s inode.
i immutable Files with this attribute cannot be deleted or renamed; hard links cannot be made to this file; most of its metadata cannot be changed; data cannot be written to the file. Modifying this attribute requires root, or a process with the CAP_LINUX_IMMUTABLE capability, as set with setcap.
j data journalling A file with this attribute has all its data written to its journal before being written to the file itself. Only effective on ext3 and ext4 filesystems which have journalling enabled and the «data=ordered» or «data=writeback» options set. If journaling is enabled in those systems, but the «data=journal» option is set, this attribute has no effect. Only root or a process with CAP_SYS_RESOURCE capability as set with setcap can change this attribute.
P project hierarchy A directory with this attribute will enforce a hierarchical structure for project IDs. Files and directories created in the directory will inherit the project ID of the directory. Rename operations are constrained so when those files or directories are moved to another directory, the project IDs will match. Hard links to these files may only be created if the project ID of the target and destination match.
s secure deletion If a file with this attribute is deleted, its data is overwritten with zeroes, similar to a simple shred. This attribute is ignored by ext2, ext3, and ext4 filesystems.
S synchronous updates When files with this attribute are modified, the changes are written synchronously to disk. Equivalent to the sync option of the mount command, for individual files.
t no tail merging A file with this attribute will not have any partial block fragment at the end of the file shared with another file’s data. This attribute is necessary for software such as LILO, which reads the filesystem directly and is not aware of tail merging. Some filesystems do not support tail merging, in which case this attribute has no effect.
T top of directory hierarchy A directory with this attribute is deemed to be the top of directory hierarchies by the Orlov block allocator, used by ext2 and ext3. The attribute gives a hint to the allocator that the subdirectories are not related in how they are used, and their data should be separate when blocks are allocated. For example, the /home directory may have this attribute, indicating that /home/mary and /home/john should be placed in separate block groups.
u undeletable When a file with this attribute is deleted, its contents are saved, enabling their later undeletion. Undelete tools that can take advantage of this attribute include extundelete.

Read-only attributes

The following attributes are read-only. They cannot be set or unset by chattr, but can be listed by lsattr.

character meaning description
E compression error The filesystem is not able to automatically compress this file.
h huge file The file is storing its blocks in units of the filesystem’s blocksize instead of in sectors. The file is, or previously was, larger than 2 TB.
I indexed directory The directory is being indexed with a hashed tree (htree).
N inline data The file has data stored inline, in the inode itself.
X compression raw access An experimental attribute indicating that the raw contents of a compressed file may be accessed directly.
Z compressed dirty file An experimental attribute indicating that a compressed file is dirty (incompletely written).

View attributes of files

For this example, we create three empty files with touch:

touch file file2 .file

We can view their permissions with ls, using the -l option:

ls -l
total 8
-rw-rw-r-- 1 hope hope 0 Jun 28 09:51 file
-rw-rw-r-- 1 hope hope 0 Jun 28 09:51 file2

File names starting with a dot (period) are not listed by ls unless the -a option is used:

ls -a
total 28
-rw-rw-r-- 1 hope hope 0 Jun 28 09:51 file
-rw-rw-r-- 1 hope hope 0 Jun 28 09:51 .file
-rw-rw-r-- 1 hope hope 0 Jun 28 09:51 file2

Now let’s view attributes by running lsattr:

lsattr
-------------e-- ./file
-------------e-- ./file2

As with ls, we must use the -a option to view files whose name starts with a dot:

lsattr -a
-------------e-- ./file
-------------e-- ./file2
-------------e-- ./.file
-------------e-- ./.
-------------e-- ./..

To view the attributes of a specific file or files, specify their names:

lsattr file
-------------e-- file
lsattr -a file file2 .file
-------------e-- file
-------------e-- file2
-------------e-- .file

View attributes of directories

Now let’s create a directory and subdirectory with mkdir -p:

mkdir -p dir/subdir

And create some empty files in those directories:

touch dir/file3 dir/file4 dir/subdir/file5

By default, lsattr does not traverse directories:

lsattr
-------------e-- ./file
-------------e-- ./file2
-------------e-- ./dir

To recursively traverse and show the contents of directories, use -R:

lsattr -R
-------------e-- ./file
-------------e-- ./file2
-------------e-- ./dir
./dir:
-------------e-- ./dir/file3
-------------e-- ./dir/file4
-------------e-- ./dir/subdir
./dir/subdir:
-------------e-- ./dir/subdir/file5

Change attributes

By default, the files and directories we created in the above examples (on Ubuntu 16.04) have the «block extents» attribute (e) set.

lsattr
-------------e-- ./file
-------------e-- ./file2
-------------e-- ./dir

Let’s give them the d attribute (a legacy attribute, meaningless on our system), using +d.

chattr +d *
lsattr
------d------e-- ./file
------d------e-- ./file2
------d------e-- ./dir

Some attributes, such as a (append-only), may only be modified by the root user:

sudo chattr +a file
lsattr
-----ad------e-- ./file
------d------e-- ./file2
------d------e-- ./dir

Attributes which apply only to directories, such as D, are not set on regular files, successfully — no error will be returned. For example, if you try to run chattr +D on a regular file, chattr will do nothing to those files, and return a successful exit status.

Notice in the next command that we try to set the D attribute on both a regular file and a directory. The attribute is set on the directory, is not set on the regular file, and chattr returns successfully.

chattr +D file dir && lsattr
-----ad------e-- ./file
------d------e-- ./file2
---D--d------e-- ./dir

(The && control operator runs the next command only if the previous command returns a successful exit status. For more information, see Shell grammar in bash.)

To unset an attribute, use the operator before your list of attributes.

chattr -D dir && lsattr
-----ad------e-- ./file
-------------e-- ./file2
-------------e-- ./dir

Only one operator may be specified per mode string, but you can specify multiple attributes one after the other (without whitespace), in any order. You may specify multiple mode strings, each with its own operator.

chattr +sSc -d * && lsattr
s-S--a--c-----e---- ./file
s-S-----c-----e---- ./file2
s-S-----c-----e---- ./dir

If an attribute requires root privileges, but you are not running the command as root, chattr will not change any attributes for that file. It will continue trying to operate on other files, and when it completes, it returns a failing exit status (an error).

To illustrate this, in the next command, we’ll try to set the a attribute on every file in the current directory without using sudo. This should fail (unless we are logged in as root), because setting a requires superuser privileges.

Also, note that in the next command we use echo to display the value of the bash special parameter ? (a question mark). The ? parameter contains the exit status of the previous command, so it will tell us if chattr succeeded (0) or failed (1). Like all bash parameters, we refer to its value by prefixing its name with $.

chattr -sS +a *; echo $?
chattr: Operation not permitted while setting flags on dir
chattr: Operation not permitted while setting flags on file2
1

The exit status 1 indicates an error occurred.

Let’s look at how the attributes changed:

lsattr
-----a--c-----e---- ./file
s-S-----c-----e---- ./file2
s-S-----c-----e---- ./dir

Notice that file did not cause an error. It already had the a flag from a previous command, so it causes no error; and so the rest of the changes (-sS) completed. The other file and directory both caused an error, and were entirely unchanged.

To set every file to match an explicit set of attributes, use the = operator. Any listed attributes will be set, and any not listed will be unset.

sudo chattr -R =es * && lsattr -R
s----------e---- ./file
s----------e---- ./file2
s----------e---- ./dir
./dir:
s----------e---- ./dir/file3
s----------e---- ./dir/file4
s----------e---- ./dir/subdir
./dir/subdir:
s----------e---- ./dir/subdir/file5

Make files immutable

If you set the i attribute, a file will be marked as «immutable», meaning its data (and some vital metadata) cannot be changed, even by root, until the attribute is unset.

touch immutable && lsattr immutable
--------------e---- immutable
sudo chattr +i immutable && lsattr immutable
----i---------e---- immutable
mv immutable newname
mv: cannot move 'immutable' to 'newname': Operation not permitted
rm immutable
rm: cannot remove 'immutable': Operation not permitted
sudo rm -f immutable
rm: cannot remove 'immutable': Operation not permitted

You cannot create a hard link to an immutable file:

ln immutable hardlink
ln: failed to create hard link 'hardlink' => 'immutable': Operation not permitted

Symbolic links are OK, though:

ln -s immutable symlink && ls -l symlink
lrwxrwxrwx 1 hope hope 6 Jun 29 07:49 symlink -> immutable

This is a good time to note that symbolic links have no attributes:

lsattr symlink
lsattr: Operation not supported While reading flags on symlink

To make files mutable again, use -i:

sudo chattr -i immutable && mv immutable newname && lsattr newname
--------------e---- newname

Make files append-only

The append-only attribute (a) makes a file immutable, except that data can be added to it.

touch appendonly && lsattr appendonly
--------------e---- appendonly
sudo chattr +a appendonly && lsattr appendonly
-----a--------e---- appendonly

You cannot overwrite the file with redirection (>):

echo "Overwriting is not allowed." > appendonly
bash: appendonly: Operation not permitted

But redirecting append-only (>>) is OK:

echo "Appending is allowed." >> appendonly && cat appendonly
Appending is allowed.
echo "Appending is allowed." >> appendonly && cat appendonly
Appending is allowed.
Appending is allowed.

Append-only files may not be moved, removed, renamed, or hard-linked.

sudo rm -f appendonly
rm: cannot remove 'appendonly': Operation not permitted
sudo ln appendonly hardlink
ln: failed to create hard link 'hardlink' => 'appendonly': Operation not permitted

For more information about redirection, see: Redirection in bash.

chown — Change the ownership of files or directories.
chmod — Change the permissions of files and directories.
ls — List the contents of a directory or directories.

Linux chattr and lsattr commands

Updated: 11/30/2020 by

chattr and lsattr commands

On Linux operating systems, the chattr command modifies the attributes of files, and lsattr lists (displays) them.

In Linux, file attributes are flags which affect how the file is stored and accessed by the filesystem. They are metadata stored in the file’s associated inode.

Description

chattr and lsattr are part of the e2fsprogs software package, available by that name in most package managers. The e2fsprogs homepage is located at https://e2fsprogs.sourceforge.net.

Note

Attributes are not the same as file permissions. For information about setting permissions, see chmod.

Syntax: chattr

chattr [-R] [-V] [-f] [-v version] [-p project] mode ... file ...

Options

chattr takes the following options:

-R Recursively change attributes of directories and their contents.
-V Provide verbose output and display program version.
-f Suppress most error messages.
-v version Set the file’s version/generation number. This is an arbitrary nine-digit number assigned to a file when it is created. It is not unique. It may be changed to any other arbitrary number.
-p project Set the file’s project number.
mode One or more mode strings. For more information, see: Mode strings, below.
file The file or files to be changed.

Mode strings

A mode string consists of an operator and one or more attributes. It takes the form:

{+|-|=}[aAcCdDeijsStTu]

One of the following operators must appear at the beginning of a mode string:

character operation
+ Attributes listed are added to the file.
Attributes listed are removed from the file.
= The attributes listed are added; any attributes omitted will be removed.

The remainder of the mode string is several characters, each representing an attribute. They are case-sensitive, cannot be separated by whitespace, and may appear in any order. For a list of attribute characters, see: Attributes, below.

Example mode strings are «+caS«, «-Asd«, and «=eAsS«.

Multiple mode strings may be specified to combine + and operators in a single command, e.g., «+asD -c» and «-a +s +D -c» are both valid.

Syntax: lsattr

lsattr [-R] [-V] [-a] [-d] [-v] file ...

Options

-R Recursively list attributes of directories and their contents.
-V Display the program version.
-a List all files in a directory, including those whose name starts with a period (‘.‘).
-d List directories as regular files, rather than listing their contents.
-v List the file’s version/generation number in addition to its attributes.

List of attributes

The following characters represent attributes that can be modified by chattr or listed with lsattr.

character attribute description
a append only The file may only be opened for writing in append mode: its existing data may not be overwritten. It cannot be deleted or renamed; hard links cannot be made to this file; most of its metadata cannot be changed. Modifying this attribute requires root privileges.
A no atime updates When the file is accessed, its atime record is not modified, which in some situations can reduce disk I/O.
c compressed Files with this attribute are automatically compressed by the kernel when written to disk. Its contents are uncompressed when read. Note: This attribute has no effect in the ext2, ext3, and ext4 filesystems.
C no copy on write Files with this attribute are not subject to copy-on-write updates. If this attribute is set on a directory, new files created in that directory get this attribute set. Note: This attribute is only effective on filesystems which perform copy-on-write. On btrfs, this attribute should be set on new or empty files. If this attribute is set after a btrfs file already contains data, the time when its data will be stable is undefined.
d no dump Files with this attribute are bypassed in any backup initiated by dump, a legacy tool for ext2 filesystems.
D synchronous directory updates Changes to a directory with this attribute are written synchronously to disk. That is, the system waits for write completion before doing something else. Equivalent to the dirsync option to the mount command, applied to a subset of files on a filesystem.
e block extents Indicates that a file should be stored using block extents. Data is stored contiguously between two blocks, and only those two blocks must be known to find the file’s data. Block extent mapping may potentially save disk space, because it reduces the number of blocks which must be listed in the file’s inode.
i immutable Files with this attribute cannot be deleted or renamed; hard links cannot be made to this file; most of its metadata cannot be changed; data cannot be written to the file. Modifying this attribute requires root, or a process with the CAP_LINUX_IMMUTABLE capability, as set with setcap.
j data journalling A file with this attribute has all its data written to its journal before being written to the file itself. Only effective on ext3 and ext4 filesystems which have journalling enabled and the «data=ordered» or «data=writeback» options set. If journaling is enabled in those systems, but the «data=journal» option is set, this attribute has no effect. Only root or a process with CAP_SYS_RESOURCE capability as set with setcap can change this attribute.
P project hierarchy A directory with this attribute will enforce a hierarchical structure for project IDs. Files and directories created in the directory will inherit the project ID of the directory. Rename operations are constrained so when those files or directories are moved to another directory, the project IDs will match. Hard links to these files may only be created if the project ID of the target and destination match.
s secure deletion If a file with this attribute is deleted, its data is overwritten with zeroes, similar to a simple shred. This attribute is ignored by ext2, ext3, and ext4 filesystems.
S synchronous updates When files with this attribute are modified, the changes are written synchronously to disk. Equivalent to the sync option of the mount command, for individual files.
t no tail merging A file with this attribute will not have any partial block fragment at the end of the file shared with another file’s data. This attribute is necessary for software such as LILO, which reads the filesystem directly and is not aware of tail merging. Some filesystems do not support tail merging, in which case this attribute has no effect.
T top of directory hierarchy A directory with this attribute is deemed to be the top of directory hierarchies by the Orlov block allocator, used by ext2 and ext3. The attribute gives a hint to the allocator that the subdirectories are not related in how they are used, and their data should be separate when blocks are allocated. For example, the /home directory may have this attribute, indicating that /home/mary and /home/john should be placed in separate block groups.
u undeletable When a file with this attribute is deleted, its contents are saved, enabling their later undeletion. Undelete tools that can take advantage of this attribute include extundelete.

Read-only attributes

The following attributes are read-only. They cannot be set or unset by chattr, but can be listed by lsattr.

character meaning description
E compression error The filesystem is not able to automatically compress this file.
h huge file The file is storing its blocks in units of the filesystem’s blocksize instead of in sectors. The file is, or previously was, larger than 2 TB.
I indexed directory The directory is being indexed with a hashed tree (htree).
N inline data The file has data stored inline, in the inode itself.
X compression raw access An experimental attribute indicating that the raw contents of a compressed file may be accessed directly.
Z compressed dirty file An experimental attribute indicating that a compressed file is dirty (incompletely written).

View attributes of files

For this example, we create three empty files with touch:

touch file file2 .file

We can view their permissions with ls, using the -l option:

ls -l
total 8
-rw-rw-r-- 1 hope hope 0 Jun 28 09:51 file
-rw-rw-r-- 1 hope hope 0 Jun 28 09:51 file2

File names starting with a dot (period) are not listed by ls unless the -a option is used:

ls -a
total 28
-rw-rw-r-- 1 hope hope 0 Jun 28 09:51 file
-rw-rw-r-- 1 hope hope 0 Jun 28 09:51 .file
-rw-rw-r-- 1 hope hope 0 Jun 28 09:51 file2

Now let’s view attributes by running lsattr:

lsattr
-------------e-- ./file
-------------e-- ./file2

As with ls, we must use the -a option to view files whose name starts with a dot:

lsattr -a
-------------e-- ./file
-------------e-- ./file2
-------------e-- ./.file
-------------e-- ./.
-------------e-- ./..

To view the attributes of a specific file or files, specify their names:

lsattr file
-------------e-- file
lsattr -a file file2 .file
-------------e-- file
-------------e-- file2
-------------e-- .file

View attributes of directories

Now let’s create a directory and subdirectory with mkdir -p:

mkdir -p dir/subdir

And create some empty files in those directories:

touch dir/file3 dir/file4 dir/subdir/file5

By default, lsattr does not traverse directories:

lsattr
-------------e-- ./file
-------------e-- ./file2
-------------e-- ./dir

To recursively traverse and show the contents of directories, use -R:

lsattr -R
-------------e-- ./file
-------------e-- ./file2
-------------e-- ./dir
./dir:
-------------e-- ./dir/file3
-------------e-- ./dir/file4
-------------e-- ./dir/subdir
./dir/subdir:
-------------e-- ./dir/subdir/file5

Change attributes

By default, the files and directories we created in the above examples (on Ubuntu 16.04) have the «block extents» attribute (e) set.

lsattr
-------------e-- ./file
-------------e-- ./file2
-------------e-- ./dir

Let’s give them the d attribute (a legacy attribute, meaningless on our system), using +d.

chattr +d *
lsattr
------d------e-- ./file
------d------e-- ./file2
------d------e-- ./dir

Some attributes, such as a (append-only), may only be modified by the root user:

sudo chattr +a file
lsattr
-----ad------e-- ./file
------d------e-- ./file2
------d------e-- ./dir

Attributes which apply only to directories, such as D, are not set on regular files, successfully — no error will be returned. For example, if you try to run chattr +D on a regular file, chattr will do nothing to those files, and return a successful exit status.

Notice in the next command that we try to set the D attribute on both a regular file and a directory. The attribute is set on the directory, is not set on the regular file, and chattr returns successfully.

chattr +D file dir && lsattr
-----ad------e-- ./file
------d------e-- ./file2
---D--d------e-- ./dir

(The && control operator runs the next command only if the previous command returns a successful exit status. For more information, see Shell grammar in bash.)

To unset an attribute, use the operator before your list of attributes.

chattr -D dir && lsattr
-----ad------e-- ./file
-------------e-- ./file2
-------------e-- ./dir

Only one operator may be specified per mode string, but you can specify multiple attributes one after the other (without whitespace), in any order. You may specify multiple mode strings, each with its own operator.

chattr +sSc -d * && lsattr
s-S--a--c-----e---- ./file
s-S-----c-----e---- ./file2
s-S-----c-----e---- ./dir

If an attribute requires root privileges, but you are not running the command as root, chattr will not change any attributes for that file. It will continue trying to operate on other files, and when it completes, it returns a failing exit status (an error).

To illustrate this, in the next command, we’ll try to set the a attribute on every file in the current directory without using sudo. This should fail (unless we are logged in as root), because setting a requires superuser privileges.

Also, note that in the next command we use echo to display the value of the bash special parameter ? (a question mark). The ? parameter contains the exit status of the previous command, so it will tell us if chattr succeeded (0) or failed (1). Like all bash parameters, we refer to its value by prefixing its name with $.

chattr -sS +a *; echo $?
chattr: Operation not permitted while setting flags on dir
chattr: Operation not permitted while setting flags on file2
1

The exit status 1 indicates an error occurred.

Let’s look at how the attributes changed:

lsattr
-----a--c-----e---- ./file
s-S-----c-----e---- ./file2
s-S-----c-----e---- ./dir

Notice that file did not cause an error. It already had the a flag from a previous command, so it causes no error; and so the rest of the changes (-sS) completed. The other file and directory both caused an error, and were entirely unchanged.

To set every file to match an explicit set of attributes, use the = operator. Any listed attributes will be set, and any not listed will be unset.

sudo chattr -R =es * && lsattr -R
s----------e---- ./file
s----------e---- ./file2
s----------e---- ./dir
./dir:
s----------e---- ./dir/file3
s----------e---- ./dir/file4
s----------e---- ./dir/subdir
./dir/subdir:
s----------e---- ./dir/subdir/file5

Make files immutable

If you set the i attribute, a file will be marked as «immutable», meaning its data (and some vital metadata) cannot be changed, even by root, until the attribute is unset.

touch immutable && lsattr immutable
--------------e---- immutable
sudo chattr +i immutable && lsattr immutable
----i---------e---- immutable
mv immutable newname
mv: cannot move 'immutable' to 'newname': Operation not permitted
rm immutable
rm: cannot remove 'immutable': Operation not permitted
sudo rm -f immutable
rm: cannot remove 'immutable': Operation not permitted

You cannot create a hard link to an immutable file:

ln immutable hardlink
ln: failed to create hard link 'hardlink' => 'immutable': Operation not permitted

Symbolic links are OK, though:

ln -s immutable symlink && ls -l symlink
lrwxrwxrwx 1 hope hope 6 Jun 29 07:49 symlink -> immutable

This is a good time to note that symbolic links have no attributes:

lsattr symlink
lsattr: Operation not supported While reading flags on symlink

To make files mutable again, use -i:

sudo chattr -i immutable && mv immutable newname && lsattr newname
--------------e---- newname

Make files append-only

The append-only attribute (a) makes a file immutable, except that data can be added to it.

touch appendonly && lsattr appendonly
--------------e---- appendonly
sudo chattr +a appendonly && lsattr appendonly
-----a--------e---- appendonly

You cannot overwrite the file with redirection (>):

echo "Overwriting is not allowed." > appendonly
bash: appendonly: Operation not permitted

But redirecting append-only (>>) is OK:

echo "Appending is allowed." >> appendonly && cat appendonly
Appending is allowed.
echo "Appending is allowed." >> appendonly && cat appendonly
Appending is allowed.
Appending is allowed.

Append-only files may not be moved, removed, renamed, or hard-linked.

sudo rm -f appendonly
rm: cannot remove 'appendonly': Operation not permitted
sudo ln appendonly hardlink
ln: failed to create hard link 'hardlink' => 'appendonly': Operation not permitted

For more information about redirection, see: Redirection in bash.

chown — Change the ownership of files or directories.
chmod — Change the permissions of files and directories.
ls — List the contents of a directory or directories.

Поговорив о пользователях и группах, самое время вспомнить про права доступа, которые для них настраиваются. Общая схема прав одинакова и для файлов, и для папок. Вы уже видели, как система отображает права доступа, в выводе команды ls -l, которая показывает содержимое директории:

Первые 10 символов содержат информацию о правах к файлу или каталогу. 

rw-

права пользователя-владельца

r--

права пользователей группы-владельца

r--

права всех остальных пользователей

Далее идёт имя пользователя-владельца и группы -владельца.

root

файл принадлежит пользователю root

root

файл принадлежит группе root

Исходя из этого, иерархия доступа на уровне пользователей разбивается следующим образом: права пользователя-владельца, права участников группы-владельца и права всех остальных. 

Соответственно, для каждой категории указывается, какие операции с файлом ей доступны: чтение (r), запись (w) или выполнение (x) — для исполняемых файлов. Для директорий параметры те же, но обозначают немного другое: просмотр директории (r), создание папок / файлов (w) внутри директории, переход в директорию (x).

Каждый из этих уровней доступа можно выразить в восьмеричной системе с помощью числового значения: 4 (r), 2 (w), 1 (x). Вот так мы и получаем общую схему прав:

a — любые пользователи
u — права пользователя g — права группы o — права всех остальных
r w x r w x r w x
4 2 1 4 2 1 4 2 1

Для отображения уровня прав помимо формата rwxrwxrwx используется упомянутый восьмеричный формат. Для этого достаточно сложить все уровни прав по категориям: 

rwxrwxrwx = (4+2+1), (4+2+1), (4+2+1) = 777

Теперь можно перейти к инструментам, которые позволяют управлять правами на файлы и директории.

Смена владельца файла или директории

Для смены владельца доступны два инструмента. Первый — chown, позволяет изменить пользователя и группу файла или папки:

chown [новый пользователь]:[новая группа] [файл или папка]

Если не указывать группу, изменится только пользователь-владелец. Если не указывать пользователя (:[новая группа]), изменится только группа-владелец. 

При изменении прав на директории можно использовать параметр -R. Он рекурсивно изменит владельца всех вложенных директорий и файлов. Представим, что нам нужно предоставить права на папку new-user для одноимённого пользователя и его группы. Команда для этого будет выглядеть так:

chown -R new-user:new-group /home/users/new-user

Второй инструмент — chgrp. В отличие от первого, меняет только группу-владельца:

chgrp [группа] [файл или папка]

Как и chown, может работать рекурсивно с помощью ключа -R.

Смена прав доступа к файлу или директории

Для работы непосредственно с правами используется команда chmod:

chmod [настройки прав] [файл или папка]

При работе с директориями опция -R позволит изменить права на все вложенные файлы и папки.

Настройки прав в chmod можно определять двумя способами:

  1. Указав категорию (u — пользователь-владелец, g — группа-владелец, o — другие пользователи, a — все пользователи), модификатор (+, - , =) и, соответственно, нужные права (r, w, x). 

    Например, представим, что у нас есть файл example.txt с максимальным уровнем прав для всех категорий пользователей: 

    Допустим, мы не хотим, чтобы кто-то в принципе мог запускать этот файл на выполнение. В таком случае нам нужно убрать параметр «x» из прав всех категорий пользователей сразу. Это можно сделать так: 

    chmod a-x example.txt

    Представим, что потом мы решили вернуть владельцу права на запуск файла. То есть нам нужно добавить параметр «x» в категорию пользователя-владельца:

    chmod u+x example.txt

    Если вдруг мы захотим изменить весь набор параметров для отдельной категории разом, это будет выглядеть следующим образом:

    chmod u=rwx example.txt
  2. Указав права в виде числового значения. Возможно, это не так прозрачно, но зато быстрее. В качестве параметра нам нужно передать это самое цифровое выражение уровня прав:

    chmod 777 example.txt 

    В примере мы назначили максимальный уровень доступа всем категориям пользователей.

    Соответственно, для изменения уровня прав отдельной категории пользователей нужно изменить только это числовое значение. Например, запретим исполнение файла для всех пользователей:

    chmod 666 example.txt

    А потом вернём, но только пользователю-владельцу:

    chmod 766 example.txt

Бывает, что нам нужно изменить права только на все папки или только на все файлы в определённой директории. Часто с этим можно столкнуться при настройке прав на файлы сайтов. Вот вам пара однострочников на этот случай: 

  • Смена прав на 755 для всех папок внутри /var/www/sites/example.com:

    find /var/www/sites/example.com/ -type d -exec chmod 755 {} ;
  • Смена прав на 644 для всех файлов внутри /var/www/sites/example.com:

    find /var/www/sites/example.com/ -type f -exec chmod 644 {} ;

Изменение атрибутов файлов

Помимо прав доступа и владельца каждый файл может иметь ряд атрибутов, определяемых на уровне файловой системы. Атрибуты показывают, какие операции могут или не могут проводиться с файлом в принципе, независимо от того, кто им владеет.

Посмотреть атрибуты файлов в текущей директории можно с помощью команды lsattr. Если запустить её без аргументов, она выведет атрибуты всех файлов в текущей директории. Если указать путь к файлу или папке, она перечислит свойства указанного файла или списка файлов в указанной папке соответственно:

lsattr example.txt

Первые 20 символов в строке предназначены для отображения атрибутов файла.

Список атрибутов может отличаться в зависимости от файловой системы. Вот список основных:

i

«godmode» — файл становится неуязвим для любых изменений. Его нельзя удалить, переименовать, изменить содержимое, создать символьную ссылку на него.

a

в файл с таким атрибутом можно только добавлять новые данные. Старое содержимое изменить или удалить не получится. Это пригодится для защиты от вредоносных вставок или замен в файлах, куда постоянно записываются данные — например, в логах. Доступ к изменению старого содержимого по умолчанию есть только у суперпользователя root.

s

активирует безвозвратное удаление файла. В том смысле, что после удаления файл нельзя будет восстановить с носителя — при удалении все использовавшиеся для хранения файла блоки на диске перезаписываются нулями.

u

активирует «обратимое» удаление файлов. Это значит, что при удалении файла с этим атрибутом его содержимое можно восстановить.

с

сжатый файл. Все данные, записываемые в файл, автоматически сжимаются, а данные, извлекаемые из файла — возвращаются в исходное состояние.

d

настраивает для файла исключение при использовании утилиты dump. То есть файл не будет включен в архив при создании резервной копии этим способом.

e

показывает, что файл в качестве указателей использует экстенты.

j

в журналируемых файловых системах (ext3, ext4) указывает на то, что при сохранении файла он сначала будет записан в журнал ФС, и только потом — на диск.

A

указывает, что при работе с файлом система не будет обновлять информацию о времени доступа к нему.

D

атрибут для директорий. Указывает, что все изменения в папке синхронно записываются на диск, минуя кэш.

S

указывает, что все изменения в файле с этим атрибутом записываются синхронно на диск, минуя кэш.

Изменить атрибуты файла позволяет команда chattr:

chattr [модификатор][изменяемые атрибуты] [целевой файл или папка]

То есть, если нам нужно защитить какой-то важный файл от посягательств, можно использовать такую команду:

chattr +i example.txt

Проверяем — посягательства не работают.

Если же нам нужно вернуть файл в нормальное состояние, нужно выполнить обратную операцию: 

chattr -i example.txt

Для просмотра более подробной информации о файловых атрибутах, их ограничениях и правилах применения используйте команду:

man chattr

В Linux атрибуты файла — это свойства метаданных, которые описывают поведение файла. Например, атрибут может указывать, сжат ли файл, или указывать, можно ли удалить файл.

Некоторые атрибуты, такие как неизменяемость, могут быть установлены или очищены, в то время как другие, такие как шифрование, доступны только для чтения и могут быть только просмотрены. Поддержка определенных атрибутов зависит от используемой файловой системы.

В этой статье объясняется, как использовать команду chattr для изменения атрибутов файлов в файловых системах Linux.

chattr Синтаксис

Команда chattr имеет следующую общую форму:

chattr [OPTIONS] [OPERATOR][ATTRIBUTES] FILE...

Значение части [OPERATOR] может быть одним из следующих символов:

  • + — Оператор «плюс» сообщает chattr о необходимости добавления указанных атрибутов к существующим.
  • - — Оператор минус указывает chattr удалить указанные атрибуты из существующих.
  • = — Оператор равенства сообщает chattr о необходимости установить указанные атрибуты как единственные.

За оператором следует один или несколько флагов [ATTRIBUTES] которые вы хотите добавить или удалить из атрибутов файла. Ниже приведен список нескольких общих атрибутов и связанных флагов:

  • a — если этот атрибут установлен, файл можно открыть только в режиме добавления для записи.
  • A — Когда файл с этим установленным атрибутом открыт, его временная запись не изменяется. atime (время доступа) — это время последнего доступа / открытия файла какой-либо командой или приложением.
  • e — этот атрибут означает, что файл использует экстенты для сопоставления блоков на диске. Атрибут e нельзя изменить с помощью chattr .
  • i — этот атрибут указывает, что файл неизменяемый, что означает, что файл нельзя удалить или переименовать.

Чтобы получить полный список всех атрибутов и флагов файлов, введите в терминале man chattr .

По умолчанию атрибуты файла не сохраняются при копировании файла с помощью таких команд, как cp или rsync .

chattr Пример

Одно из распространенных применений chattr — установка флага неизменяемости для файла или каталога, чтобы пользователи не могли удалить или переименовать файл.

Вы можете просмотреть атрибуты файла с помощью команды lsattr :

lsattr todo.txt

Вывод ниже показывает, что установлен только флаг e :

--------------e----- todo.txt

Чтобы сделать файл неизменяемым, добавьте флаг i с оператором + к существующим атрибутам:

sudo chattr +i todo.txt

Мы используем sudo, потому что только root может изменить неизменяемый флаг.

Подтвердите, что атрибут добавлен:

lsattr todo.txt
----i---------e----- todo.txt

Чтобы отменить изменения и удалить неизменяемый флаг, используйте оператор - :

sudo chattr +i todo.txt

С помощью chattr вы можете добавлять или удалять сразу несколько атрибутов. Например, чтобы сделать файл неизменяемым и указать ядру не отслеживать время последнего доступа, вы должны использовать:

sudo chattr +iA todo.txt

Последний оператор, который вы можете использовать, — это оператор = . Например, чтобы установить атрибут e как единственный атрибут, вы должны запустить:

sudo chattr "=e" todo.txt

Обратите внимание, что оператор и флаг заключены в кавычки, чтобы избежать интерпретации оболочки символа + .

Выводы

chattr — это инструмент командной строки для изменения атрибутов файлов в файловой системе Linux.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Linux write error to file
  • Linux usb io error
  • Linux uncompression error system halted
  • Linux ubuntu как изменить разрешение экрана
  • Linux syntax error unterminated quoted string

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии