Розуміння дозволів UNIX та типів файлів


68

Я ніколи насправді не chmodпрацював до сьогодні. Я слідував підручником, який пояснив мені велику справу.

Наприклад, я читав, що у вас є три різні групи дозволів:

  • власник ( u)
  • група ( g)
  • всі ( o)

На основі цих трьох груп я тепер знаю, що:

  • Якщо файл належить користувачеві, доступ користувача визначає доступ.
  • Якщо група файлу така сама, як група користувача, дозвіл групи визначає доступ.
  • Якщо користувач не є власником файлу і не знаходиться в групі, тоді використовується інший дозвіл.

Я також дізнався, що ви маєте такі дозволи:

  • читати ( r)
  • написати ( w)
  • Execute ( x)

Я створив каталог для перевірки своїх нещодавно набутих знань:

mkdir test

Потім я зробив кілька тестів:

chmod u+rwx test/
# drwx------
chmod g+rx test/
# drwxr-x---
chmod u-x test/
# drw-r-x---

Після дурень протягом певного часу, я думаю, що я нарешті розібрався з chmodтим, як ви встановили дозвіл за допомогою цієї команди.


Але ...

У мене ще є кілька питань:

  • Що означає dна початку?
  • Як називається слот, що містить, і які інші значення він може містити?
  • Як я можу його встановити та зняти?
  • Яка цінність для цього d? (Оскільки у вас є лише 7 = 4 + 2 + 1 7 = 4 + 2 + 1 7 = 4 + 2 + 1)
  • Чому люди іноді використовують 0777замість того, 777щоб встановлювати свої дозволи?

Але оскільки мені не слід задавати кілька запитань, я спробую задати це одним питанням.

У системі на основі UNIX, таких як усі дистрибутиви Linux, що стосуються дозволів, що означає перша частина ( d) та яка користь для цієї частини дозволів?


3
Будь ласка, наступного разу спробуйте задати лише одне запитання, кілька запитань зазвичай погані для посилання та майже ніколи не звертаються до всіх одночасно.
Ківі

1
@Kiwy Вибачте, я подумав, що я зроблю це так, бо це стосується тієї самої теми. Якщо ви хочете, ви можете запропонувати кращу назву для мого питання, щоб покращити його довідку.
Пітер

1
До речі, значення для "d" - 040000 - його можна знайти у файлах заголовків під назвою S_IFDIR. Ви не використовуєте його під час встановлення файлового режиму, але stat()функція фактично повертає значення 040750 для drwxr-x---.
Випадково832

2
@jamesqf Насправді, тепер, коли я розумію, як карта восьмеричних кодів, мені простіше думати про це.
HalosGhost

4
@ Петер: немає дурних питань - просто дурні, які не вчаться, бо бояться задавати питання.
mgarciaisaia

Відповіді:


117

Я відповім на ваші запитання в трьох частинах: типи файлів, дозволи та випадки використання для різних форм chmod.

Типи файлів

Перший символ у ls -lвисновку представляє тип файлу; dозначає, що це каталог. Його неможливо встановити чи зняти, це залежить від того, як створено файл. Повний список типів файлів можна знайти в документації ls ; ті, на які ви, швидше за все, натрапите

  • -: "Звичайний" файл, створений з будь-якою програмою, яка може записати файл
  • b: блокувати спеціальний файл, як правило, дискові або розділові пристрої, можна створити за допомогою mknod
  • c: спеціальний файл символів, який також можна створити за допомогою mknod(див. /devприклади)
  • d: каталог, можна створити за допомогою mkdir
  • l: символічне посилання, можна створити за допомогою ln -s
  • p: названа труба, яку можна створити за допомогою mkfifo
  • s: socket, можна створити за допомогою nc -U
  • D: двері , створені деякими серверними процесами на Solaris / openindiana.

Дозволи

chmod 0777використовується для встановлення всіх дозволів в одному chmodвиконанні, а не комбінування змін і u+т. д. Кожна з чотирьох цифр є вісімковим значенням, що представляє собою набір дозволів:

  • suid, sgidІ «липкі» (див нижче)
  • дозволи користувачів
  • групові дозволи
  • "Інші" дозволи

Восьмічне значення обчислюється як сума дозволів:

  • "Читання" - 4
  • "Написати" - це 2
  • "Виконати" - 1

Для першої цифри:

  • suidдорівнює 4; двійкові файли з цим набором бітів виконуються як їх власник (зазвичай root)
  • sgidдорівнює 2; бінарні файли з цим набором бітів виконуються як група власників (це використовувалося для ігор, тому можна отримати загальний бал, але це часто ризик для безпеки при поєднанні з вразливими місцями в іграх), а файли, створені в каталогах із цим набором бітів, належать до Група власників каталогу за замовчуванням (це зручно для створення спільних папок)
  • "Липкий" (або "обмежене видалення") - 1; Файли в каталогах із цим набором бітів можуть видаляти лише їх власник, власник каталогу або root(див. /tmpзагальний приклад цього).

Дивіться на chmodсторінку керівництва для деталей. Зауважте, що у всьому цьому я ігнорую інші функції безпеки, які можуть змінювати дозволи користувачів на файли (SELinux, файли ACL ...).

Спеціальні біти обробляються по-різному в залежності від типу файлу (звичайний файл чи каталог) та базової системи. (Про це йдеться у chmodманері.) У системі, яку я тестував (з coreutils8.23 у ext4файловій системі, під управлінням ядра Linux 3.16.7-ckt2), поведінка полягає в наступному. Для файлу спеціальні біти завжди очищаються, якщо явно не встановлено, так chmod 0777це еквівалентно chmod 777, і обидві команди очищають спеціальні біти і надають всім повний дозвіл на файл. Для каталогу спеціальні біти ніколи не повністю очищаються за допомогою чотиризначної цифрової форми, тому по суті chmod 0777також еквівалентніchmod 777але це вводить в оману, оскільки деякі спеціальні біти залишаться такими, якими є. (Попередня версія цієї відповіді отримав це неправильно.) Для того, щоб очистити спеціальні біти в каталогах , які необхідно використовувати u-s, g-sі / або o-tявно або вказати негативне числове значення, так chmod -7000очистить все спеціальні біти в каталозі.

У ls -lвиході suid, sgidі «липкі» з'являються в місці xвходу: suidце sабо Sзамість користувача x, sgidє sабо Sзамість групи - х x, і «липкий» є tчи Tзамість інших x. Малі літери вказують на те, що встановлено як спеціальний біт, так і виконуваний біт; з великої літери вказується, що встановлено лише спеціальний біт.

Різні форми ХМД

Через описану вище поведінку використання повних чотирьох цифр chmodможе бути заплутаним (принаймні, виявляється, я був плутаний). Це корисно, коли ви хочете встановити спеціальні біти, а також біти дозволу; інакше біти очищаються, якщо ви маніпулюєте файлом, зберігаються, якщо ви маніпулюєте каталогом. Таким чином chmod 2750гарантує, що ви отримаєте принаймні sgidі точно u=rwx,g=rx,o=; але chmod 0750не обов'язково очищати спеціальні біти.

Використання числових режимів замість текстових команд ( [ugo][=+-][rwxXst]) - це, мабуть, більше звичка і мета команди. Коли ви звикли використовувати числові режими, часто простіше просто вказати повний режим таким чином; і корисно мати можливість продумувати дозволи, використовуючи числові режими, оскільки багато інших команд можуть використовувати їх ( install, mknod...).

Деякі варіанти тексту можуть стати в нагоді: якщо ви просто хочете переконатися, що файл може виконувати будь-хто, chmod a+xзробіть це, незалежно від того, які інші дозволи. Так само +Xдодає дозвіл на виконання, лише якщо один із дозволів на виконання вже встановлений або файл є каталогом; це може бути зручно для відновлення дозволів у всьому світі, не потребуючи файлів спеціальних справ проти v. каталогів. Таким чином, chmod -R ug=rX,u+w,o=еквівалентно застосуванню chmod -R 750до всіх каталогів та виконуваних файлів та chmod -R 640до всіх інших файлів.


Хоча інші відповіді були досить хорошими, ви справді витратили деякий час, відповідаючи на це питання. Дякую.
Петро

У * BSD каталоги поводяться так, ніби їх sgidбіт завжди встановлювався, незалежно від його фактичного значення. У FreeBSD suidбіт може бути налаштований так, щоб діяти аналогічно sgid(тобто файли та підкаталоги, створені всередині, матимуть того самого власника, що і каталог), за умови, що базова файлова система підтримує це і встановлюється за допомогою suiddirпараметра.
lcd047

" +Xдодає дозвіл на виконання лише в тому випадку, якщо один з дозволів на виконання вже встановлений або файл - це каталог" спасибі @ stephen-kitt, який відсутній, документація "вже встановлена" насправді кинула мене на цикл!
Райан Фішер

39

Отже, дозволи в Linux є дуже важливими. Спробую зробити коротке пояснення.

Для фрагментів файлового режиму

Кожен файл Unix має набір дозволів, які визначають, чи можете ви читати, писати чи запускати файл. Запуск ls -l відображає дозволи. Ось приклад такого дисплея:

-rw-r--r-- 1 user somegroup 7041 Mar 26 19:34 somefile

Я додаю зображення фрагментів файлового режиму:

введіть тут опис зображення

Тип може бути різна річ. Наприклад:

  • d (каталог)
  • c (символьний пристрій)
  • l (симпосилання)
  • p (названа труба)
  • s (розетка)
  • b (блок пристрою)
  • D (двері, не поширені в системах Linux, але перенесені)

Якщо ви хочете встановити деякі дозволи для всіх каталогів, ви можете використовувати атрибут R, наприклад:

chmod -R 777 /some/directory/

Для chmod 777 проти 0777

chmodКоманда зазвичай очікує введення , щоб бути восьмеричним числом, провідний нуль відноситься до значення липки / SGID / Suid битового триплета. Однак у C це має значення, оскільки 777було б переведено на 01411(восьмеричний), встановивши таким чином клейкий біт (див. chmod(2)Сторінку man), прочитати дозволи для власника та виконавчий біт для групи та інших (що є досить дивним поєднанням) .

ЗРІД 1

Я знайшов іншу картину про права доступу до Linux, і я додам, щоб зрозуміти простіше: Дозволи на файли UNIX


5
Ви помиляєтесь щодо 777 проти 0777. Обидва є восьмеричними (десятковий жодний сенс у цьому випадку не має сенсу), але у чотиризначній формі перша цифра встановлює спеціальні біти (sticky & setuid).
Оріон

3
@orion Іноді це дійсно так, наприклад, у C-подібному коді chmod(777)насправді було б еквівалентом запущеного chmod 1411(тобто chmodкоманди з аргументом 1411).
петерф

2
... що у випадку з системою sccall (або її обгорткою) та двійковим файлом із однойменною назвою може бути дещо заплутаним.
петерф

3
Python Master Race вирішити цю зворотну задачу, заборонивши всі «номера» , які починаються з 0, змушуючи користувачеві бути явним , якщо вони хочуть - або, крім десяткової, наприклад шестигранні: 0x1FFдвійковий: 0b111111111або вісімкове: 0o777. PYTHON POWER
Нік T

Джерело зображення?
рюк

10

dозначає, що це каталог, якщо у вас є файл, він є, -і якщо це посилання, ви знайдете l. Його неможливо встановити / зняти.

Якщо ви використовуєте 0777 в якості дозволів, ви надаєте повний контроль (читати + писати + виконувати) кожному користувачеві / групі системи. Це ледачий спосіб вирішити проблеми, коли у вас є користувачі / групи, які не можуть отримати доступ до каталогів / файлів.

Наприклад, якщо ви перераховуєте вміст каталогу і отримуєте такий:

-rw-r--r-- 1 root root 42596 jun 7 2012 preloadable_libintl.so

preloadable_libintl.so - це файл, що належить користувачу root та груповому корінню. Власник має читання та запис, то група має тільки доступ для читання і будь-який інший користувач має доступ на читання. Це можна перекласти як 644.

Якщо я зміню його на 777, це буде виглядати приблизно так:

-rwxrwxrwx 1 root root 42596 jun 7 2012 preloadable_libintl.so


7

Отримавши тут відповідь на моє запитання та зробивши деякі дослідження щодо результату, я знайшов статтю, яка дуже добре пояснює це. Я хотів би поділитися тут частинами цієї статті для подальшого використання.

Перегляд дозволів

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

$ ls -l

-lПеремикач має важливе значення , тому що використання lsбез нього буде відображати тільки імена файлів або папок в каталозі.

Нижче наведено приклад використання ls -lв моєму домашньому каталозі:

total 128
drwxr-xr-x 2 peter users  4096 Jul  5 21:03 Desktop
drwxr-xr-x 6 peter users  4096 Jul  5 17:37 Documents
drwxr-xr-x 2 peter users  4096 Jul  5 13:45 Downloads
drwxr-xr-x 2 peter users  4096 Jun 24 03:36 Movies
drwxr-xr-x 2 peter users  4096 Jun 24 03:38 Music
drwxr-xr-x 2 peter users  4096 Jun 26 00:09 Pictures
-rw-r--r-- 1 peter users   354 Jul  6 17:15 chmodtest

Що означають стовпці

Перший стовпець - тип кожного файлу:

  • - позначає звичайний файл.
  • d позначає каталог, тобто папку, що містить інші файли або папки.
  • p позначає названу трубу (він же FIFO).
  • l позначає символічну ланку.

Букви після цього - це дозволи, цей перший стовпчик - це те, що нас буде найбільше цікавити. Другий - скільки посилань у файлі, ми можемо сміливо його ігнорувати. Третій стовпець має два значення / імена: Перший (у моєму прикладі "peter") - це ім'я користувача, якому належить файл. Друге значення ("користувачі" у прикладі) - це група, до якої належить власник (Докладніше про групи).

Наступний стовпець - це розмір файлу чи каталогу в байтах та інформації, після яких - дати та час останнього зміни файлу чи каталогу, і звичайно назва файлу чи каталогу.

Що означають дозволи

Перші три букви після першого -або d- це дозволи, які має власник. Наступні три букви - це дозволи, які стосуються групи. Останні три листи - це дозволи, які стосуються всіх інших.

Кожен набір із трьох літер складається з r wта x. rзавжди в першій позиції, wзавжди в другій позиції і xзавжди в третій позиції. rє дозволом читання, wє дозволом на запис та xє дозволом на виконання. Якщо -на місці одного з цих літер є дефіс ( ), це означає, що дозвіл не надається, а якщо лист присутній, то він надається.

Папки

У випадку папок біти режиму можна інтерпретувати так:

  • r (read) означає здатність читати зміст даного каталогу,
  • w(запис) означає можливість запису змісту даного каталогу (створення нових файлів, папок; перейменування, видалення існуючих файлів, папок), якщо і лише якщо встановлено біт виконання. В іншому випадку цей дозвіл є безглуздим.
  • x (Виконати) означає можливість вводити заданий каталог за допомогою команди cd та доступу до файлів, папок у цьому каталозі.

Зміна дозволів за допомогою команди chmod

chmodце команда в Linux та інших Unix-подібних операційних системах. Це дозволяє змінювати дозволи (або режим доступу) для файлу чи каталогу.

Ви можете змінювати дозволи двома різними способами: - на основі тексту - на chmod основі чисельностіchmod

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

Для зміни режиму дозволу або доступу до файлу ми використовуємо команду chmod у терміналі. Нижче наведена загальна структура команди:

chmod who=permissions filename

Де хто є хтось із ряду листів, і кожен означає, кому ви збираєтесь надати дозвіл. Вони такі:

u - The user that owns the file.
g - The group the file belongs to.
o - The other users i.e. everyone else.
a - all of the above - use this instead of having to type ugo.

Права доступу є такими ж , як уже обговорювалося ( r, wі x).

Команда chmod дозволяє нам додавати та віднімати дозволи з існуючого набору, використовуючи + або - замість =. Це відрізняється від наведених вище команд, які в основному переписують дозвіл (тобто змінити дозвіл r--на rw-, вам все ще потрібно включити r, а також wпісля того , як =в chmodкоманді. Якщо ви пропустили r, це прибере rдозвіл як вони перезаписуються символом =. Використовуючи + і - уникайте цього, додаючи або відбираючи поточний набір дозволів).

Метод числення

chmod також можна встановити дозволи, використовуючи числа.

Використання номерів - це ще один метод, який дозволяє одночасно редагувати дозволи для всіх трьох власників, груп та інших. Основна структура коду така:

chmod xxx file/directory

Де xxx - це трицифрове число, де кожна цифра може бути будь-якою від 1 до 7. Перша цифра стосується дозволів для власника, друга цифра стосується дозволів для групи, а третя цифра стосується дозволів для всіх інших.

У цьому позначенні чисел значення r, w і x мають власне числове значення:

r=4
w=2
x=1

Щоб придумати трицифрове число, потрібно врахувати, які дозволи мати власник, група та користувач, а потім підсумовувати їх значення. Наприклад, скажіть, що я хотів дозволити власнику каталогу дозволу на читання-запис та виконання, і я хотів згрупувати та всіх інших, які щойно читали та виконували дозволи. Я б придумав такі числові значення:

Owner: rwx = 4+2+1=7
Group: r-x = 4+0+1=5 (or just 4+1=5)
Other: r-x = 4+0+1=5 (or just 4+1=5)

Final number = 755

$ chmod 755 filename

Це еквівалент використання наступного:

chmod u=rwx filename
chmod go=rx filename

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


Просто копіювання тексту з іншої статті є - принаймні, грубим. Можливо також порушення авторських прав. Якщо це не тільки скопійовано або ви справді використовували невеликі деталі (дружні до авторських прав завдяки добросовісному використанню), будь ласка, будь-ласка, додайте посилання на статтю, на яку ви посилаєтесь / цитуєте.
рюк

0

Для d питань

Це повідомляє вам про тип файлу Unix. За замовчуванням Unix має лише 3 типи файлів. Вони є:

  • - - Звичайний файл
  • d - Файл каталогів
  • Спеціальний файл (з 5 підтипами):
    • b - Блокувати файл
    • c - файл пристрою символів
    • p - Названий файл труби або просто файл файлу
    • l - Символічний файл посилань
    • s - Сокетний файл

Детальніше читайте тут: Типи файлів в Linux / Unix пояснюються докладно

0777 проти 777

Клейкий біт вказаний чи ні. Коли встановлений клейкий біт каталогів, файлова система обробляє файли в таких каталогах спеціальним чином, тому лише власник файлу, власник каталогу або користувач root може перейменувати або видалити файл. Без встановлення липкого біта будь-який користувач, який має дозволи на запис та виконання для каталогу, може перейменовувати або видаляти вміщені файли, незалежно від власника файлу.

0777 встановлює 777 дозволів на файли, а клейкий біт 0 - немає спеціальних режимів.

777 встановлює 777 дозволів на файли, не змінюючи клейкий біт.

Читайте більше: липкий біт і chmod


2
Краще: але це все ще не пропонує нічого, що інші відповіді вже не охоплені ...
jasonwryan

1
(1) Існує три основні типи файлів: звичайні файли, каталоги та все інше. Що? Де ти це береш? У чудовій схемі речей звичайні файли та каталоги досить схожі. Іменовані труби та символічні посилання більше схожі на прості файли та каталоги, ніж вони схожі на файли пристроїв або розетки. (2) Ви думаєте, chmod 777чи не очищають встановлені, жорсткі та клейкі біти? Спробуй це.
G-Man

У Unix є 7 типів файлів, а не 3.
wjandrea
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.