Чому дозволи на створення файлів за замовчуванням 666?


12

Як я з'ясував, при використанні umask найвищі дозволи, які ви можете надати файлам, становлять 666. Це робиться компанією umask 0000. Це пов’язано з дозволами на створення файлів за замовчуванням, які, як видається, становлять 666 у всіх системах, які я знаю.

Я знаю, що для файлів нам потрібні права виконавця, щоб показати їх вміст.
Але чому ми обмежуємо дозволи на створення файлів за замовчуванням на 666?


Яка система? Єдиний, з яким umaskя зустрічався, завжди був 0022, створюючи дозвіл за замовчуванням 644.
манатура

Ніхто вас не зрозумів. Umask використовує дозволу на файли за замовчуванням 666 та підкреслює власне значення (що становить 0022 для вашої системи). Отже, найвищі дозволи, які ви можете встановити, umask 0000- це все ще обмежує кількість дозволів 666. (Але, мабуть, у папках використовується 777)
Пітер

Зробив тебе. Тепер це гарне питання.
манатура

2
Для перегляду вмісту файлів вам не потрібні виконавчі дозволи. Це так для каталогів , тому каталоги створюються за замовчуванням з дозволами на виконання.
Джозеф Р.

1
Я вважаю, [але потрібно більше дивитися, щоб бути впевненим], що це задумано, щоб уникнути деяких проблем із безпекою: без доступу до "chmod" ви не можете зробити файл виконуваним. umask 0000 створює файли з 0666 та каталоги з 0777 [що, до речі, є досить жахливим налаштуванням за замовчуванням, безпека!]
Олів'є Дулак

Відповіді:


10

Наскільки я можу сказати, це важко закодовано у стандартні утиліти. Я straced одночасно touchстворити новий файл і mkdirстворити новий каталог.

touchСліду проводиться таким чином :

open("newfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3

в той час як цей mkdirслід дав це:

mkdir("newdir", 0777)                   = 0

Окрім кодування процесу створення файлів / каталогів на C, я не бачу способу зміни дозволів за замовчуванням. Мені здається, що не робити файли виконуваними за замовчуванням має сенс: ви не хочете, щоб якийсь випадковий текст був випадково неправильно трактований як команди оболонки.

Оновлення

Щоб навести приклад того, як біти дозволів жорстко кодуються до стандартних утиліт. Ось кілька відповідних рядків із двох файлів у coreutilsпакеті, що містить вихідний код для обох, touch(1)і mkdir(1)серед інших:

mkdir.c:

if (specified_mode)
   {   
     struct mode_change *change = mode_compile (specified_mode);
     if (!change)
       error (EXIT_FAILURE, 0, _("invalid mode %s"),
              quote (specified_mode));
     options.mode = mode_adjust (S_IRWXUGO, true, umask_value, change,
                                  &options.mode_bits);
     free (change);
   }   
  else
    options.mode = S_IRWXUGO & ~umask_value;
}   

Іншими словами, якщо режим не вказаний, встановіть його S_IRWXUGO(читайте: 0777), зміненого на umask_value.

touch.c ще зрозуміліше:

int default_permissions =
  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;

Тобто, надайте всім права на читання та запис (читайте: 0666), які будуть змінені процесом umaskстворення файлів, звичайно.

Ви можете бути в змозі обійти це програмно тільки: тобто при створенні файлів з будь-якої програми C, де ви робите системні виклики безпосередньо або з мови , що дозволяє зробити низькорівневий системний виклик (дивіться, наприклад , в Perl sysopenUnder Подивитись профіль perldoc -f sysopen).


Ви маєте рацію, я не хочу аварій. Але неможливо змінити це, жахливо! Стандартні значення повинні бути 777. А нам потрібно umask fileі umask dir. Встановіть два різні значення за замовчуванням та штраф. Але тепер у мене немає можливості створювати файли з exec perms.
Пітер

1
@PeterI Що ж, mkdir(1)пропонує вам -mперемикач, щоб вказати режим каталогу під час створення. Однак для файлів, оскільки для створення файлів використовується система open(2)syscall, інструмент, який ви використовуєте для створення файлу, є тим, хто відповідає за передачу бітів режиму, openі ви не можете сказати з цього питання. install(1)за замовчуванням копіює ваш файл на нове місце та встановлює біти виконання, але це все ще не відбувається під час створення.
Джозеф Р.

Що ви говорите, що, touchнаприклад, відповідає за встановлення правильних значень. Чи знаєте ви, де він зберігає значення? Можливо, вони встановлені в усьому світі - щоб ми могли їх змінити? Тому що я хочу звільнитися ;)
Петро

@PeterI Дивіться оновлену відповідь.
Джозеф Р.

1
@PeterI Я знову оновив відповідь. Ви можете зробити системний виклик безпосередньо з C або іншої мови, наприклад Perl.
Джозеф Р.

6

По-перше, немає глобальних стандартних умов, дозволи залежать від програми, яка створює файл. Наприклад, ця маленька програма C створить файл '/ tmp / foo' з дозволами 0777, якщо umask 0000 (у будь-якому випадку дозволи будуть 0777 & ~ umask):

int main() 
{
   creat("/tmp/foo", 0777);
   return 0;
}

При цьому багато програм створюють файли з дозволами 0666. Це дві причини:

  1. Безпека: ви не хочете, щоб будь-який довільний файл виконувався.
  2. Зручність: більшість файлів не потрібно виконувати. Простіше встановити виконуваний біт на декілька вибраних файлів, ніж скинути його на величезну кількість інших файлів. Звичайно, umask 0133 вирішив би це, але тоді нічого не виграється, і ви не можете дозволити програмам створювати виконувані файли, навіть якщо цього хочете.

1
Файли створюються без встановленого біта x (Execute) з міркувань безпеки. Ненавмисне виконання файлів [cw] має стати "поганою річчю" (tm). Програма chmod дає можливість (повторно) встановлювати біти дозволів за потребою.
ChuckCottrill
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.