我正在尝试弄清楚如何使用umask
.
我umask 027
期望这会导致我自己获得所有权限,为组读取和执行权限,而其他人则没有权限。
基于默认值 777 减去 027 = 750。
但是当我跑步时:
umask 027
touch test
ls -l test
我回来了:
-rw-r----- 1 philip philip 0 Jun 3 12:14 test
这根本不是我所期待的。
我的理解哪里出了问题umask
?
答案1
umask 无法添加权限,它仅用于屏蔽创建相关文件的进程设置的一些权限位。
umask 由
open(2)
、mkdir(2)
和其他创建文件的系统调用使用,以修改新创建的文件或目录的权限。具体来说,umask 中的权限从 mode 参数到open(2)
和被关闭mkdir(2)
。
touch
创建具有权限的文件0666
,就像大多数其他应用程序在不创建明确已知的私有内容或应该可执行的内容时所做的那样(在这种情况下,它们将分别使用0600
或0777
)。如果umask
可以用来强制添加权限位,例如电子邮件客户端之类的东西,ssh-keygen
就会遇到麻烦:他们无法创建只能由所有者访问的文件!
$ umask 027; rm xxx; strace -etrace=open touch xxx 2>&1 | grep xxx ; ls -l xxx
open("xxx", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
-rw-r----- 1 itvirta itvirta 0 Jun 3 20:40 xxx
如果我们安排以更广泛的权限创建文件,我们也会看到执行位:
$ umask 027; rm yyy;
$ perl -MFcntl -e 'sysopen F, "yyy", O_WRONLY|O_CREAT, 0777'
$ ls -l yyy
-rwxr-x--- 1 itvirta itvirta 0 Jun 3 20:40 yyy*
同样,我们可以创建一个没有x
设置位的目录......
$ perl -MFcntl -e 'mkdir "ddd", 0666'
$ ls -ld ddd
drw-r----- 2 itvirta itvirta 4096 Jun 3 20:45 ddd/