2013-12-20 3 views
2

Я хочу создать файл с битами разрешения: 125 => --x-w-r-x.почему результат umask отличается от битов разрешения

Таким образом, значение Umask должно быть => 666-125 = 541

так, когда я пишу команды ниже;

umask 541 
touch /tmp/newfile 
ls -l /tmp/newfile 

the result is : --w--w-rw- 

Почему не получается --x-w-r-x?

Заранее спасибо ...

+0

Обратите внимание, что umask применяется как побитовая операция «и» , а не вычитание. – nos

+0

большое спасибо за ваш комментарий. –

ответ

1

На странице fopen(3) людей:

Any created files will have mode S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP 
    | S_IROTH | S_IWOTH (0666), as modified by the process's umask value 
    (see umask(2)). 

Они должны быть явно изменены после создания, если вы хотите любые другие биты установлены. touch не делает.

Кроме того, ваша математика ошибочна.

>>> oct(0666 & ~0125) 
'0642' 
+0

спасибо за ваш ответ. Так почему же значение маски 026 работает для файлов с заданными битами? –

+0

0642 выводит меня: '----- w-r--' –

+0

Как это удивительно, если вы действительно прочитали ответ? –

2

по умолчанию Отправной Биты для обычного файла (в отличие от каталога или символической ссылки) являются 0666.Давайте разберем, что вниз в разрешениях компонентов:

  • 0 означает, что никаких специальных разрешений (например, setuid (4), setgid (2), или sticky (1)) установлены
  • первый 6 (или 110 в двоичной системе) означает, что user получает r (первый 1) и w (второй 1), но не x (0) по умолчанию
  • второй 6 означает то же самое, что и первый 6, но для group вместо user
  • третьего 6 означает то же самое, что и первый 6, но others вместо user

Теперь вы хотите изменение это по умолчанию 0125:

  • 0 означает, как указано выше
  • не 1 (или 001 в двоичной системе) означает, что user только получает x но не r или w
  • 2 (или 010 в двоичной системе) означает, что group только получает w но не r или x
  • 5 (или 101 в двоичной системе) означает others получить r и x но не w

К сожалению, единственная операция, которую разрешает umask, - binary AND NOT. Он не допускает целочисленного вычитания. Так как вы начинаете с 0666 (000 110 110 110), просто нет способа использовать AND NOT, чтобы получить любой из этих 0 s, чтобы он превратился в 1 s.

Ближайший вы можете получить с umask является --- -w- r-- или 0024 путем маскировки 110 (6) из user по умолчанию, 100 (4) из group по умолчанию, и 010 (2) из others по умолчанию. После этого каждый новый файл, который вы создаете, будет

umask 642 
touch file.txt 

000 110 110 110 &~ 
000 110 100 010 
--- --- --- --- 
000 000 010 100 
    0 0 2 4 --- -w- r-- file.txt 

Если вы хотите новые файлы, то также x разрешения, вам придется добавить их на второй стадии (или использовать что-то другое, чем touch), например: chmod u+x,o+x file.txt ,

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

umask 0027 
touch file.txt 

000 110 110 110 &~ 
000 000 010 111 
--- --- --- --- 
000 110 100 000 
    0 6 4 0 rw- r-- --- file.txt 

mkdir directory 

000 111 111 111 &~ 
000 000 010 111 
--- --- --- --- 
000 111 101 000 
    0 7 5 0 rwx r-x --- directory/ 

Таким образом, вы можете указать x маски в вашем umask, когда вы создаете новый каталог, но они не будут иметь никакого эффекта по созданию файла.

Смежные вопросы